This workbook includes: 1. Creating a Seurat object from CellRanger output. 2. Preparing and cleaning the data a) Visualize QC b) Filter out unwanted cells c) Identify and remove doublets d) Normalization and scale e) Select Variable features 3. Merging and Harmonizing samples a) Merge samples b) Use Seurat find anchors to integrate c) Compare merged vs integrated 4. Dimensional reduction clustering and visualization a) PCA and component selection b) UMAP c) Clustering and visualization 5. Cluster annotation a) Visualize expression of known cell type markers b) Find cluster markers and look them up in reference cell type library c) Manual cluster annotation d) Decisions on merging clusters 6. Automated cluster annotation a) Seurat label transfer b) scClassify

Example data

We will use data from iPSC derived midbrain organoids There are two samples from dissociated midbrain organoids 1) iPSC line from a patient with Parkinson’s Disease carrying a triplication of the gene SNCA 2) The same iPSC line CRISPR corrected to make an isogenenic control

Analysis workflow

Load your required libraries. You need to have these libraries already installed.

library("scClassify")
library(SingleCellExperiment)
Warning: package ‘SingleCellExperiment’ was built under R version 4.2.2
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats

Attaching package: ‘matrixStats’

The following object is masked from ‘package:dplyr’:

    count


Attaching package: ‘MatrixGenerics’

The following objects are masked from ‘package:matrixStats’:

    colAlls, colAnyNAs, colAnys, colAvgsPerRowSet,
    colCollapse, colCounts, colCummaxs, colCummins,
    colCumprods, colCumsums, colDiffs, colIQRDiffs, colIQRs,
    colLogSumExps, colMadDiffs, colMads, colMaxs, colMeans2,
    colMedians, colMins, colOrderStats, colProds,
    colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
    colSums2, colTabulates, colVarDiffs, colVars,
    colWeightedMads, colWeightedMeans, colWeightedMedians,
    colWeightedSds, colWeightedVars, rowAlls, rowAnyNAs,
    rowAnys, rowAvgsPerColSet, rowCollapse, rowCounts,
    rowCummaxs, rowCummins, rowCumprods, rowCumsums,
    rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
    rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians,
    rowMins, rowOrderStats, rowProds, rowQuantiles,
    rowRanges, rowRanks, rowSdDiffs, rowSds, rowSums2,
    rowTabulates, rowVarDiffs, rowVars, rowWeightedMads,
    rowWeightedMeans, rowWeightedMedians, rowWeightedSds,
    rowWeightedVars

Loading required package: GenomicRanges
Warning: package ‘GenomicRanges’ was built under R version 4.2.2
Loading required package: stats4

Attaching package: ‘stats4’

The following object is masked from ‘package:spam’:

    mle

Loading required package: BiocGenerics

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:spam’:

    cbind, rbind

The following objects are masked from ‘package:dplyr’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, aperm, append, as.data.frame, basename,
    cbind, colnames, dirname, do.call, duplicated, eval,
    evalq, Filter, Find, get, grep, grepl, intersect,
    is.unsorted, lapply, Map, mapply, match, mget, order,
    paste, pmax, pmax.int, pmin, pmin.int, Position, rank,
    rbind, Reduce, rownames, sapply, setdiff, sort, table,
    tapply, union, unique, unsplit, which.max, which.min

Loading required package: S4Vectors
Warning: package ‘S4Vectors’ was built under R version 4.2.2

Attaching package: ‘S4Vectors’

The following objects are masked from ‘package:dplyr’:

    first, rename

The following object is masked from ‘package:tidyr’:

    expand

The following objects are masked from ‘package:base’:

    expand.grid, I, unname

Loading required package: IRanges

Attaching package: ‘IRanges’

The following objects are masked from ‘package:dplyr’:

    collapse, desc, slice

The following object is masked from ‘package:purrr’:

    reduce

Loading required package: GenomeInfoDb
Warning: package ‘GenomeInfoDb’ was built under R version 4.2.2
Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with
    'browseVignettes()'. To cite Bioconductor, see
    'citation("Biobase")', and for packages
    'citation("pkgname")'.


Attaching package: ‘Biobase’

The following object is masked from ‘package:MatrixGenerics’:

    rowMedians

The following objects are masked from ‘package:matrixStats’:

    anyMissing, rowMedians


Attaching package: ‘SummarizedExperiment’

The following object is masked from ‘package:SeuratObject’:

    Assays

The following object is masked from ‘package:Seurat’:

    Assays
library("Matrix")

Attaching package: ‘Matrix’

The following object is masked from ‘package:S4Vectors’:

    expand

The following object is masked from ‘package:spam’:

    det

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack

Load the data: Starting with the control data.

# load data

# read in the data - CellRanger output - barcodes, features, expression matrix

# you need to enter the file path to the folder with the three files
con_data <- Read10X("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/CellRangerOuts/AST23isogenic/raw_feature_bc_matrix")

#Look at the dimensions of the matrix
dim(con_data)
[1]   33538 6794880
#Look at a small part of the data
con_data[1:5, 1:5]
5 x 5 sparse Matrix of class "dgCMatrix"
            AAACCCAAGAAACACT-1 AAACCCAAGAAACCAT-1 AAACCCAAGAAACCCA-1
MIR1302-2HG                  .                  .                  .
FAM138A                      .                  .                  .
OR4F5                        .                  .                  .
AL627309.1                   .                  .                  .
AL627309.3                   .                  .                  .
            AAACCCAAGAAACCCG-1 AAACCCAAGAAACCTG-1
MIR1302-2HG                  .                  .
FAM138A                      .                  .
OR4F5                        .                  .
AL627309.1                   .                  .
AL627309.3                   .                  .
#Look at the distribution of the number of UMIs per cell
colSums(con_data) %>% summary
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
    0.00     0.00     0.00     4.48     0.00 58329.00 
#Look at the distribution of the number of genes per cell  
colSums(con_data > 0) %>% summary
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
   0.000    0.000    0.000    1.695    0.000 7999.000 

Remove barcodes with too few genes that could be empty droplets

#Remove barcodes with less than 100 genes detected (you can select a different value here)
# without 
con_data <- con_data[, colSums(con_data > 0)> 100]
dim(con_data)
[1] 33538  3739

Filter genes and create a Seurat object

#We might not want to include genes that occur in few cells are no cells.  Here we will filter out genes/transcripts that are in less than 3 cells. 
# you don't have to filter any genes you can also change to any filter threshold you want

#Make a Seurat object
#Removing any genes detected in less than 3 cells

# we can also filter cells at this stage too. 
con_seu <- CreateSeuratObject(con_data, project = "Control", min.cells = 3)
# look at the object dimensions
con_seu
An object of class Seurat 
18557 features across 3739 samples within 1 assay 
Active assay: RNA (18557 features, 0 variable features)

Data distribution

# look at the distribution of total counts of RNA across cells
con_seu$nCount_RNA %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    106    2125    6240    7441   10870   58316 
# look at the distribution of unique RNA transcripts across cells

con_seu$nFeature_RNA %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  101.0   997.5  2556.0  2433.6  3608.5  7981.0 

Visualize the distributions


VlnPlot(con_seu, features = c("nCount_RNA","nFeature_RNA"), pt.size = 0)

Filter out unwanted cells

con_seu$percent.MT %>% summary
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   2.257   4.783   8.075   8.524  94.762 
VlnPlot(con_seu, features = "percent.MT", pt.size = 0.001)

Now we will filter some cells with too high mitochondrial RNA Filter out cells with too many RNA reads - these are likely doublets



#Remove any cells with more than 20% mitochondrial counts
con_seu.ft <- subset(con_seu, percent.MT < 20)

#Remove cells with very high UMI counts, which may be possible multiplets
con_seu.ft <- subset(con_seu.ft, nCount_RNA < 20000)

# see the results
VlnPlot(con_seu, features = c("percent.MT", "nCount_RNA", "nFeature_RNA"), pt.size = 0.001)


# check how many cells we have
con_seu.ft
An object of class Seurat 
18557 features across 3219 samples within 1 assay 
Active assay: RNA (18557 features, 0 variable features)

We might want to filter more cells with low total and/or unique RNA


con_seu
An object of class Seurat 
18557 features across 3219 samples within 1 assay 
Active assay: RNA (18557 features, 0 variable features)

Apply final filtering conditions

dim(con_seu_ft)
[1] 18557  2938

Clear extra data object we don’t need anymore


rm(con_data,con_seu.ft)

Normalizing

# Normalize data (log normalization) and select genes with variable expression across cells --------------------------------------

con_seu_ft <- NormalizeData(con_seu_ft, normalization.method = "vst", scale.factor = 10000)
Error in NormalizeData.default(object = GetAssayData(object = object,  : 
  Unknown normalization method: vst

Finding Variable features

VariableFeaturePlot(con_seu_ft)
var[1:10]
 [1] "DLK1"  "TTR"   "CRYAB" "TAC1"  "TPH1"  "CENPF"
 [7] "ANXA1" "LDHA"  "GDF15" "TFPI2"

Dimensionality reduction PCA and UMAP

We won’t run this code I’ve included this analysis that calculates the cut-off for signicance of component numbers. However the function runs multiple iterations of the PCA and will take a long time to run.

# Jackstraw

#Assess how many PCs capture most of the information in the data 
seu <-JackStraw(seu, reduction = "pca",
  dims = 30)
seu <- ScoreJackStraw(seu, reduction = "pca", dims = 1:30)
JackStrawPlot(seu, dims = 1:30)

Non-linear dimensional reduction using UMAP


#Non-linear dimensionality reduction
#Choosing how many PCs to input can depend on the elbow plot and on the number of cells
#There are many parameters that can e tweaked and optimized in a UMAP plot
#You can see some demos here: https://pair-code.github.io/understanding-umap/
con_seu_ft <- RunUMAP(con_seu_ft, dims = 1:18)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
21:40:57 UMAP embedding parameters a = 0.9922 b = 1.112
21:40:57 Read 2938 rows and found 18 numeric columns
21:40:57 Using Annoy for neighbor search, n_neighbors = 30
21:40:57 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
21:40:57 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpnG1dt1/file27ca605ea146
21:40:57 Searching Annoy index using 1 thread, search_k = 3000
21:40:57 Annoy recall = 100%
21:40:58 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
21:40:58 Initializing from normalized Laplacian + noise (using irlba)
21:40:58 Commencing optimization for 500 epochs, with 116704 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
21:41:03 Optimization finished
UMAPPlot(con_seu_ft)

NA
NA

Doublet identification

bcmvn_con <- find.pK(sweep.stats_con)
NULL

ggplot(bcmvn_con, aes(x = pK, y = BCmetric, group = "Sweep")) + geom_point() + geom_line() + 
  theme(axis.text.x = element_text(angle = 90))


nExp_poi <- round(0.025*nrow(con_seu_ft@meta.data))
con_seu_ft <- doubletFinder_v3(con_seu_ft, PCs = 1:18, pN = 0.25, pK = 0.08, nExp = nExp_poi, reuse.pANN = FALSE, sct = FALSE)
[1] "Creating 979 artificial doublets..."
[1] "Creating Seurat object..."
[1] "Normalizing Seurat object..."
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Finding variable genes..."
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data..."
Centering and scaling data matrix

  |                                                     
  |                                               |   0%
  |                                                     
  |========================                       |  50%
  |                                                     
  |===============================================| 100%
[1] "Running PCA..."
[1] "Calculating PC distance matrix..."
[1] "Computing pANN..."
[1] "Classifying doublets.."
#Here we update the Seurat object version just in case the one returned by DoubletFinder is an older version
con_seu_ft <- UpdateSeuratObject(con_seu_ft)
Validating object structure
Updating object slots
Ensuring keys are in the proper structure
Ensuring feature names don't have underscores or pipes
Object representation is consistent with the most current Seurat version

Visualize the doublet removal results


# we need to look in the data object

#Visualize and assess the cells called as probable doublets
UMAPPlot(con_seu_ft, group.by = "DF.classifications_0.25_0.08_73")


# table of doublets and signlets
con_seu_ft$DF.classifications_0.25_0.08_73 %>% table
.
Doublet Singlet 
     73    2865 
# visualize the features in doublets and singlets
VlnPlot(con_seu_ft, features = c("nCount_RNA", "nFeature_RNA", "percent.MT", "pANN_0.25_0.08_73"), 
        group.by = "DF.classifications_0.25_0.08_73", pt.size = 0.001, ncol = 2, log = TRUE)

dim(con_seu_ft)
[1] 18557  2938
dim(con_seu_ft2)
[1] 18557  2865

Repeat the above steps for the SNCA triplication patient line

# read in data

ast_data <- Read10X("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/CellRangerOuts/AST23/raw_feature_bc_matrix")


# create seurat object


# filter object with the same settings as with the control


# PCA analysis

# Remove doublets
# clean up 
rm(ast_data,ast_seu_ft,bcmvn_ast,bcmvn_con,con_seu_ft, sweep.res.ast, sweep.res.con, sweep.stats_ast, sweep.stats_con)

BREAK

Merge data objects


merge_seurat <- merge(con_seu_ft2,ast_seu_ft2)
Warning in CheckDuplicateCellNames(object.list = objects) :
  Some cell names are duplicated across objects provided. Renaming to enforce unique cell names.
merge_seurat
An object of class Seurat 
19204 features across 4028 samples within 1 assay 
Active assay: RNA (19204 features, 0 variable features)
unique(merge_seurat$orig.ident)
[1] "Control" "SNCA"   

Find anchors between the two data objects

sample.list <- SplitObject(merge_seurat, split.by = "orig.ident")

# We have already normalized and identified variable features in each sample
# If we had not done so we can normalize here
#for (i in 1:length(sample.list)){
 # org.list[[i]] <- NormalizeData(org.list[[i]], verbose = FALSE)
  #org.list[[i]] <- FindVariableFeatures(org.list[[i]], selection.method = "vst")
#}

# Now we find features that can act as anchors between the two samples
int.anchors <- FindIntegrationAnchors(object.list = sample.list, dims = 1:50)
Computing 2000 integration features
No variable features found for object1 in the object.list. Running FindVariableFeatures ...
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
No variable features found for object2 in the object.list. Running FindVariableFeatures ...
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Scaling features for provided objects

  |                                                  | 0 % ~calculating  
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Finding all pairwise anchors

  |                                                  | 0 % ~calculating  
Running CCA
Merging objects
Finding neighborhoods
Finding anchors
    Found 4320 anchors
Filtering anchors
    Retained 3529 anchors

  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=16s  
integrated_seurat <- IntegrateData(anchorset = int.anchors, dims = 1:50)
Merging dataset 2 into 1
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data

Optional: save the integrated object or read in the Integrated object for the next step.

# remove # comment from the code you want to run

saveRDS(integrated_seurat,"IntegratedSeurat.RDS")
#integrated_seurate <- readRDS("IntegratedSeurat.RDS")

PCA and UMAP on the merged object

# merged object

DefaultAssay(merge_seurat) <- "RNA"

merge_seurat <- ScaleData(merge_seurat, verbose = FALSE)
# in the merge data set we sill need features for the PCA input
merge_seurat <- FindVariableFeatures(merge_seurat, selection.method = "vst")
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
merge_seurat <- RunPCA(merge_seurat, npcs = 30, verbose = FALSE)
merge_seurat <- RunUMAP(merge_seurat, reduction = "pca", dims = 1:30)
09:45:55 UMAP embedding parameters a = 0.9922 b = 1.112
09:45:55 Read 4028 rows and found 30 numeric columns
09:45:55 Using Annoy for neighbor search, n_neighbors = 30
09:45:55 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
09:45:56 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpnG1dt1/file27ca2b429337
09:45:56 Searching Annoy index using 1 thread, search_k = 3000
09:45:56 Annoy recall = 100%
09:45:57 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
09:45:57 Initializing from normalized Laplacian + noise (using irlba)
09:45:57 Commencing optimization for 500 epochs, with 163142 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
09:46:04 Optimization finished

Repeat PCA and UMAP for the integrated object

Idents(integrated_seurat) <- "integrated"
integrated_seurat <- ScaleData(integrated_seurat, verbose = FALSE)
# only the integrated features will be the pca input

integrated_seurat <- RunPCA(integrated_seurat, npcs = 30, verbose = FALSE)
integrated_seurat <- RunUMAP(integrated_seurat, reduction = "pca", dims = 1:30)
09:41:56 UMAP embedding parameters a = 0.9922 b = 1.112
09:41:56 Read 4028 rows and found 30 numeric columns
09:41:56 Using Annoy for neighbor search, n_neighbors = 30
09:41:56 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
09:41:56 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpnG1dt1/file27ca184449b3
09:41:56 Searching Annoy index using 1 thread, search_k = 3000
09:41:57 Annoy recall = 100%
09:41:57 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
09:41:58 Initializing from normalized Laplacian + noise (using irlba)
09:41:58 Commencing optimization for 500 epochs, with 165954 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
09:42:04 Optimization finished

Optional: save the PCA and UMAP integrated object or read in the saved object

# remove # comment from the code you want to run
saveRDS(integrated_seurat,"IntegratedSeuratGraphs.RDS")
#integrated_seurat <- readRDS("IntegratedSeuratGraphs.RDS")

Let’s look at the UMAPs from the merged vs the integrated data


p1 <- DimPlot(merge_seurat, group.by = "orig.ident") + ggtitle("Merge")
p2 <- DimPlot(integrated_seurat, group.by = "orig.ident") + ggtitle("Integrated")

p1

p2

We see almost no difference in this data. This is not the case in all data sets

Cluster the integrated data

# see the importance of the pca components
ElbowPlot(integrated_seurat, ndims=30)

integrated_seurat
An object of class Seurat 
21204 features across 4028 samples within 2 assays 
Active assay: integrated (2000 features, 2000 variable features)
 1 other assay present: RNA
 2 dimensional reductions calculated: pca, umap
dim(integrated_seurat)
[1] 2000 4028

We will choose 20 PCs There are 4028 cells. A common rule of thumb for choosing k for nearest neighbours is using the square root of the number of cells = 63

Visualize the UMAP of the different cluster resolutions

res <- c(0.05,0.25,0.4,0.5,0.6,1,1.5)
resolutions <- paste("integrated_snn_res.", res, sep="")
resolutions
[1] "integrated_snn_res.0.05" "integrated_snn_res.0.25"
[3] "integrated_snn_res.0.4"  "integrated_snn_res.0.5" 
[5] "integrated_snn_res.0.6"  "integrated_snn_res.1"   
[7] "integrated_snn_res.1.5" 
for(r in resolutions){
  print(DimPlot(integrated_seurat, group.by = r))
}

NA
NA

BREAK

Now we need to choose a resolution to annotate. I will select resolution of 0.6.

# Scale the total RNA
# before we only scaled the integrated expression for the genes used for integration
# now we want to scale all genes

DefaultAssay(integrated_seurat) <- "RNA"
integrated_seurat <- ScaleData(integrated_seurat)
Centering and scaling data matrix

  |                                                                
  |                                                          |   0%
  |                                                                
  |===                                                       |   5%
  |                                                                
  |======                                                    |  10%
  |                                                                
  |=========                                                 |  15%
  |                                                                
  |============                                              |  20%
  |                                                                
  |==============                                            |  25%
  |                                                                
  |=================                                         |  30%
  |                                                                
  |====================                                      |  35%
  |                                                                
  |=======================                                   |  40%
  |                                                                
  |==========================                                |  45%
  |                                                                
  |=============================                             |  50%
  |                                                                
  |================================                          |  55%
  |                                                                
  |===================================                       |  60%
  |                                                                
  |======================================                    |  65%
  |                                                                
  |=========================================                 |  70%
  |                                                                
  |============================================              |  75%
  |                                                                
  |==============================================            |  80%
  |                                                                
  |=================================================         |  85%
  |                                                                
  |====================================================      |  90%
  |                                                                
  |=======================================================   |  95%
  |                                                                
  |==========================================================| 100%

Look at known cell type markers

# features list from literature

da_neurons <- c("TH","SLC6A3","SLC18A2","SOX6","NDNF","SNCG","ALDH1A1","CALB1","TACR2","SLC17A6","SLC32A1","OTX2","GRP","LPL","CCK","VIP")
NPC_orStemLike <- c("DCX","NEUROD1","TBR1","PCNA","MKI67","SOX2","NES","PAX6","MASH1")
mature_neurons = c("RBFOX3","SYP","DLG45","VAMP1","VAMP2","TUBB3","SYT1","BSN","HOMER1","SLC17A6")
excitatory_neurons = c("GRIA2","GRIA1","GRIA4","GRIN1","GRIN2B","GRIN2A","GRIN3A","GRIN3","GRIP1","CAMK2A")
inhbitory_neurons = inh = c("GAD1","GAD2", "GAT1","PVALB","GABR2","GABR1","GBRR1","GABRB2","GABRB1","GABRB3","GABRA6","GABRA1","GABRA4","TRAK2")
astrocytes <- c("GFAP","S100B","AQP4","APOE", "SOX9")
oligodendrocytes <- c("MBP","MOG","OLIG1","OLIG2","SOX10")
opc <- 
radial_glia <- c("PTPRC","AIF1","ADGRE1", "VIM", "TNC","PTPRZ1","FAM107A","HOPX","LIFR",
              "ITGB5","IL6ST")
endothelial <-
epithelial <- c("HES1","HES5","SOX2","SOX10","NES","CDH1","NOTCH1")

microglia <- c("IBA1","P2RY12","P2RY13","TREM119", "GPR34","SIGLECH","TREM2",
               "CX3CR1","FCRLS","OLFML3","HEXB","TGFBR1", "SALL1","MERTK",
               "PROS1")

features <- c("MKI67","SOX2","POU5F1","DLX2","PAX6","SOX9","HES1","NES","RBFOX3","MAP2","NCAM1","CD24","GRIA2","GRIN2B","GABBR1","GAD1","GAD2","GABRA1","GABRB2","TH","ALDH1A1","LMX1B","NR4A2","CORIN","CALB1","KCNJ6","CXCR4","ITGA6","SLC1A3","CD44","AQP4","S100B", "PDGFRA","OLIG2","MBP","CLDN11","VIM","VCAM1")

Seurat has several helpful plotting function that use ggplot

# we set the active identity of the meta data to be the clusters at the resolution we want to label
Idents(integrated_seurat) <- "integrated_snn_res.0.6"

FeaturePlot(integrated_seurat, label = TRUE, features = short_list)
Warning: Could not find RBFOX3 in the default search locations, found in RNA assay instead
Warning: Could not find MAP2 in the default search locations, found in RNA assay instead
Warning: Could not find TH in the default search locations, found in RNA assay instead
Warning: Could not find MBP in the default search locations, found in RNA assay instead

# this will let us see one at at time
for (i in short_list) {
  print(FeaturePlot(integrated_seurat, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}

NA
NA

Now that we see the TH is all in one spot that is part of a large cluster we look back at the different cluster level.

# look at the Feature plots with the cluster resolution 1

Dot Plots


DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = short_list, assay = "RNA") + RotatedAxis()




DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = da_neurons, assay = "RNA") + RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
  The following requested variables were not found: SLC6A3, TACR2, VIP

DotPlot(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = mature_neurons, assay = "RNA") + RotatedAxis()
Warning in FetchData.Seurat(object = object, vars = features, cells = cells) :
  The following requested variables were not found: DLG45

Heatmaps



DoHeatmap(integrated_seurat, group.by = "integrated_snn_res.1", 
        features = short_list, slot = "scale.data")

Look at more expression lists

Find Cluster markers

# cluster markers will be calculated for the active identity

Idents(integrated_seurat) <- "integrated_snn_res.1"
ClusterMarkers <- FindAllMarkers(integrated_seurat, only.pos = TRUE)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~15s          
  |++                                                | 2 % ~15s          
  |++                                                | 3 % ~15s          
  |+++                                               | 4 % ~14s          
  |+++                                               | 5 % ~14s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 8 % ~13s          
  |+++++                                             | 9 % ~13s          
  |+++++                                             | 10% ~13s          
  |++++++                                            | 11% ~12s          
  |++++++                                            | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |+++++++                                           | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |+++++++++                                         | 16% ~12s          
  |+++++++++                                         | 17% ~11s          
  |++++++++++                                        | 18% ~11s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 22% ~11s          
  |++++++++++++                                      | 23% ~11s          
  |++++++++++++                                      | 24% ~10s          
  |+++++++++++++                                     | 25% ~10s          
  |+++++++++++++                                     | 26% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |++++++++++++++++                                  | 30% ~09s          
  |++++++++++++++++                                  | 31% ~09s          
  |+++++++++++++++++                                 | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |+++++++++++++++++++                               | 38% ~08s          
  |++++++++++++++++++++                              | 39% ~08s          
  |++++++++++++++++++++                              | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |+++++++++++++++++++++                             | 42% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |+++++++++++++++++++++++                           | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |++++++++++++++++++++++++                          | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |+++++++++++++++++++++++++                         | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |++++++++++++++++++++++++++                        | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |+++++++++++++++++++++++++++                       | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |++++++++++++++++++++++++++++                      | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 58% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |+++++++++++++++++++++++++++++++                   | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |++++++++++++++++++++++++++++++++                  | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~11s          
  |++                                                | 2 % ~10s          
  |++                                                | 3 % ~10s          
  |+++                                               | 4 % ~10s          
  |+++                                               | 5 % ~10s          
  |++++                                              | 7 % ~10s          
  |++++                                              | 8 % ~10s          
  |+++++                                             | 9 % ~09s          
  |+++++                                             | 10% ~09s          
  |++++++                                            | 11% ~09s          
  |+++++++                                           | 12% ~09s          
  |+++++++                                           | 13% ~09s          
  |++++++++                                          | 14% ~09s          
  |++++++++                                          | 15% ~09s          
  |+++++++++                                         | 16% ~09s          
  |+++++++++                                         | 18% ~09s          
  |++++++++++                                        | 19% ~09s          
  |++++++++++                                        | 20% ~08s          
  |+++++++++++                                       | 21% ~08s          
  |+++++++++++                                       | 22% ~08s          
  |++++++++++++                                      | 23% ~08s          
  |+++++++++++++                                     | 24% ~08s          
  |+++++++++++++                                     | 25% ~08s          
  |++++++++++++++                                    | 26% ~08s          
  |++++++++++++++                                    | 27% ~08s          
  |+++++++++++++++                                   | 29% ~07s          
  |+++++++++++++++                                   | 30% ~07s          
  |++++++++++++++++                                  | 31% ~07s          
  |++++++++++++++++                                  | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~07s          
  |++++++++++++++++++                                | 34% ~07s          
  |++++++++++++++++++                                | 35% ~07s          
  |+++++++++++++++++++                               | 36% ~07s          
  |+++++++++++++++++++                               | 37% ~07s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |+++++++++++++++++++++                             | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~06s          
  |++++++++++++++++++++++                            | 44% ~06s          
  |+++++++++++++++++++++++                           | 45% ~06s          
  |++++++++++++++++++++++++                          | 46% ~06s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |+++++++++++++++++++++++++                         | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |+++++++++++++++++++++++++++                       | 54% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |+++++++++++++++++++++++++++++                     | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |++++++++++++++++++++++++++++++                    | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |+++++++++++++++++++++++++++++++                   | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=10s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |+                                                 | 2 % ~08s          
  |++                                                | 3 % ~07s          
  |++                                                | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |+++                                               | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |+++++                                             | 10% ~07s          
  |++++++                                            | 11% ~06s          
  |++++++                                            | 12% ~06s          
  |+++++++                                           | 13% ~06s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |++++++++++                                        | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~05s          
  |+++++++++++++                                     | 25% ~05s          
  |+++++++++++++                                     | 26% ~05s          
  |++++++++++++++                                    | 27% ~05s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~06s          
  |++++++++++++++++                                  | 31% ~06s          
  |++++++++++++++++                                  | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |+++++++++++++++++                                 | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |++++++++++++++++++                                | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |+++++++++++++++++++++                             | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |++++++++++++++++++++++                            | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |+++++++++++++++++++++++                           | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~19s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~18s          
  |+++                                               | 5 % ~18s          
  |++++                                              | 6 % ~18s          
  |++++                                              | 7 % ~18s          
  |+++++                                             | 8 % ~17s          
  |+++++                                             | 9 % ~17s          
  |++++++                                            | 10% ~17s          
  |++++++                                            | 11% ~17s          
  |+++++++                                           | 12% ~17s          
  |+++++++                                           | 14% ~16s          
  |++++++++                                          | 15% ~16s          
  |++++++++                                          | 16% ~16s          
  |+++++++++                                         | 17% ~16s          
  |+++++++++                                         | 18% ~16s          
  |++++++++++                                        | 19% ~15s          
  |++++++++++                                        | 20% ~15s          
  |+++++++++++                                       | 21% ~15s          
  |+++++++++++                                       | 22% ~15s          
  |++++++++++++                                      | 23% ~15s          
  |++++++++++++                                      | 24% ~14s          
  |+++++++++++++                                     | 25% ~14s          
  |++++++++++++++                                    | 26% ~14s          
  |++++++++++++++                                    | 27% ~14s          
  |+++++++++++++++                                   | 28% ~14s          
  |+++++++++++++++                                   | 29% ~13s          
  |++++++++++++++++                                  | 30% ~13s          
  |++++++++++++++++                                  | 31% ~13s          
  |+++++++++++++++++                                 | 32% ~13s          
  |+++++++++++++++++                                 | 33% ~13s          
  |++++++++++++++++++                                | 34% ~13s          
  |++++++++++++++++++                                | 35% ~12s          
  |+++++++++++++++++++                               | 36% ~12s          
  |+++++++++++++++++++                               | 38% ~12s          
  |++++++++++++++++++++                              | 39% ~12s          
  |++++++++++++++++++++                              | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~11s          
  |+++++++++++++++++++++                             | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |++++++++++++++++++++++                            | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |+++++++++++++++++++++++                           | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |++++++++++++++++++++++++                          | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |+++++++++++++++++++++++++                         | 50% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |+++++++++++++++++++++++++++                       | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |++++++++++++++++++++++++++++                      | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |+++++++++++++++++++++++++++++                     | 56% ~08s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |++++++++++++++++++++++++++++++                    | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |+++++++++++++++++++++++++++++++                   | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=19s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~06s          
  |++                                                | 2 % ~06s          
  |++                                                | 3 % ~06s          
  |+++                                               | 4 % ~06s          
  |+++                                               | 5 % ~06s          
  |++++                                              | 6 % ~06s          
  |++++                                              | 7 % ~06s          
  |+++++                                             | 8 % ~06s          
  |+++++                                             | 9 % ~06s          
  |++++++                                            | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 14% ~05s          
  |++++++++                                          | 15% ~05s          
  |++++++++                                          | 16% ~05s          
  |+++++++++                                         | 17% ~05s          
  |+++++++++                                         | 18% ~05s          
  |++++++++++                                        | 19% ~05s          
  |++++++++++                                        | 20% ~05s          
  |+++++++++++                                       | 21% ~05s          
  |+++++++++++                                       | 22% ~05s          
  |++++++++++++                                      | 23% ~05s          
  |++++++++++++                                      | 24% ~05s          
  |+++++++++++++                                     | 25% ~05s          
  |++++++++++++++                                    | 26% ~05s          
  |++++++++++++++                                    | 27% ~04s          
  |+++++++++++++++                                   | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |++++++++++++++++                                  | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |++++++++++++++++++                                | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 36% ~04s          
  |+++++++++++++++++++                               | 38% ~04s          
  |++++++++++++++++++++                              | 39% ~04s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |+++++++++++++++++++++++++++++                     | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~16s          
  |++                                                | 2 % ~15s          
  |++                                                | 3 % ~14s          
  |+++                                               | 4 % ~14s          
  |+++                                               | 5 % ~14s          
  |++++                                              | 6 % ~14s          
  |++++                                              | 7 % ~13s          
  |+++++                                             | 8 % ~13s          
  |+++++                                             | 9 % ~13s          
  |++++++                                            | 10% ~13s          
  |++++++                                            | 11% ~13s          
  |+++++++                                           | 12% ~13s          
  |+++++++                                           | 13% ~12s          
  |++++++++                                          | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |+++++++++                                         | 16% ~12s          
  |+++++++++                                         | 17% ~12s          
  |++++++++++                                        | 18% ~12s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 21% ~11s          
  |++++++++++++                                      | 22% ~11s          
  |++++++++++++                                      | 23% ~11s          
  |+++++++++++++                                     | 24% ~11s          
  |+++++++++++++                                     | 26% ~11s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |+++++++++++++++                                   | 30% ~10s          
  |++++++++++++++++                                  | 31% ~10s          
  |++++++++++++++++                                  | 32% ~10s          
  |+++++++++++++++++                                 | 33% ~10s          
  |+++++++++++++++++                                 | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |++++++++++++++++++                                | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |+++++++++++++++++++                               | 38% ~09s          
  |++++++++++++++++++++                              | 39% ~09s          
  |++++++++++++++++++++                              | 40% ~09s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |+++++++++++++++++++++                             | 42% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |+++++++++++++++++++++++                           | 46% ~08s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |+++++++++++++++++++++++++++                       | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~07s          
  |++++++++++++++++++++++++++++                      | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |+++++++++++++++++++++++++++++                     | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 58% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |+++++++++++++++++++++++++++++++                   | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |++++++++++++++++++++++++++++++++                  | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |++++++++++++++++++++++++++++++++++                | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~22s          
  |++                                                | 2 % ~21s          
  |++                                                | 3 % ~21s          
  |+++                                               | 4 % ~21s          
  |+++                                               | 5 % ~20s          
  |++++                                              | 6 % ~20s          
  |++++                                              | 7 % ~20s          
  |+++++                                             | 8 % ~19s          
  |+++++                                             | 9 % ~19s          
  |++++++                                            | 10% ~19s          
  |++++++                                            | 11% ~19s          
  |+++++++                                           | 12% ~19s          
  |+++++++                                           | 13% ~18s          
  |++++++++                                          | 14% ~18s          
  |++++++++                                          | 15% ~18s          
  |+++++++++                                         | 16% ~18s          
  |+++++++++                                         | 18% ~18s          
  |++++++++++                                        | 19% ~17s          
  |++++++++++                                        | 20% ~17s          
  |+++++++++++                                       | 21% ~17s          
  |+++++++++++                                       | 22% ~17s          
  |++++++++++++                                      | 23% ~16s          
  |++++++++++++                                      | 24% ~16s          
  |+++++++++++++                                     | 25% ~16s          
  |+++++++++++++                                     | 26% ~16s          
  |++++++++++++++                                    | 27% ~15s          
  |++++++++++++++                                    | 28% ~15s          
  |+++++++++++++++                                   | 29% ~15s          
  |+++++++++++++++                                   | 30% ~15s          
  |++++++++++++++++                                  | 31% ~15s          
  |++++++++++++++++                                  | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~14s          
  |++++++++++++++++++                                | 35% ~14s          
  |+++++++++++++++++++                               | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |++++++++++++++++++++                              | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~13s          
  |+++++++++++++++++++++                             | 40% ~13s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |+++++++++++++++++++++++                           | 44% ~12s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |++++++++++++++++++++++++                          | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |+++++++++++++++++++++++++                         | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |++++++++++++++++++++++++++                        | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~10s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~14s          
  |++                                                | 2 % ~13s          
  |++                                                | 3 % ~13s          
  |+++                                               | 4 % ~12s          
  |+++                                               | 5 % ~12s          
  |++++                                              | 7 % ~12s          
  |++++                                              | 8 % ~11s          
  |+++++                                             | 9 % ~11s          
  |+++++                                             | 10% ~11s          
  |++++++                                            | 11% ~11s          
  |+++++++                                           | 12% ~11s          
  |+++++++                                           | 13% ~11s          
  |++++++++                                          | 14% ~10s          
  |++++++++                                          | 15% ~10s          
  |+++++++++                                         | 16% ~10s          
  |+++++++++                                         | 18% ~10s          
  |++++++++++                                        | 19% ~10s          
  |++++++++++                                        | 20% ~10s          
  |+++++++++++                                       | 21% ~10s          
  |+++++++++++                                       | 22% ~10s          
  |++++++++++++                                      | 23% ~09s          
  |+++++++++++++                                     | 24% ~09s          
  |+++++++++++++                                     | 25% ~09s          
  |++++++++++++++                                    | 26% ~09s          
  |++++++++++++++                                    | 27% ~09s          
  |+++++++++++++++                                   | 29% ~09s          
  |+++++++++++++++                                   | 30% ~09s          
  |++++++++++++++++                                  | 31% ~09s          
  |++++++++++++++++                                  | 32% ~08s          
  |+++++++++++++++++                                 | 33% ~08s          
  |++++++++++++++++++                                | 34% ~08s          
  |++++++++++++++++++                                | 35% ~08s          
  |+++++++++++++++++++                               | 36% ~08s          
  |+++++++++++++++++++                               | 37% ~08s          
  |++++++++++++++++++++                              | 38% ~08s          
  |++++++++++++++++++++                              | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~07s          
  |+++++++++++++++++++++                             | 42% ~07s          
  |++++++++++++++++++++++                            | 43% ~07s          
  |++++++++++++++++++++++                            | 44% ~07s          
  |+++++++++++++++++++++++                           | 45% ~07s          
  |++++++++++++++++++++++++                          | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |+++++++++++++++++++++++++                         | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~06s          
  |++++++++++++++++++++++++++                        | 51% ~06s          
  |++++++++++++++++++++++++++                        | 52% ~06s          
  |+++++++++++++++++++++++++++                       | 53% ~06s          
  |+++++++++++++++++++++++++++                       | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |+++++++++++++++++++++++++++++                     | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |++++++++++++++++++++++++++++++                    | 58% ~05s          
  |++++++++++++++++++++++++++++++                    | 59% ~05s          
  |+++++++++++++++++++++++++++++++                   | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=12s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~10s          
  |++                                                | 2 % ~10s          
  |++                                                | 3 % ~09s          
  |+++                                               | 4 % ~09s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |+++++                                             | 9 % ~09s          
  |+++++                                             | 10% ~09s          
  |++++++                                            | 11% ~09s          
  |++++++                                            | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |+++++++                                           | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |++++++++                                          | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |+++++++++++                                       | 20% ~08s          
  |+++++++++++                                       | 21% ~08s          
  |++++++++++++                                      | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |++++++++++++++                                    | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |+++++++++++++++                                   | 30% ~07s          
  |++++++++++++++++                                  | 31% ~07s          
  |++++++++++++++++                                  | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |+++++++++++++++++++                               | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |+++++++++++++++++++++                             | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |++++++++++++++++++++++                            | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |+++++++++++++++++++++++                           | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |++++++++++++++++++++++++                          | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |+++++++++++++++++++++++++++                       | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |+++++++++++++++++++++++++++++                     | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~18s          
  |+                                                 | 2 % ~17s          
  |++                                                | 3 % ~16s          
  |++                                                | 4 % ~16s          
  |+++                                               | 5 % ~16s          
  |+++                                               | 6 % ~16s          
  |++++                                              | 7 % ~16s          
  |++++                                              | 8 % ~15s          
  |+++++                                             | 9 % ~15s          
  |+++++                                             | 10% ~15s          
  |++++++                                            | 11% ~15s          
  |++++++                                            | 12% ~15s          
  |+++++++                                           | 13% ~15s          
  |+++++++                                           | 14% ~14s          
  |++++++++                                          | 15% ~14s          
  |++++++++                                          | 16% ~14s          
  |+++++++++                                         | 17% ~14s          
  |+++++++++                                         | 18% ~14s          
  |++++++++++                                        | 19% ~13s          
  |++++++++++                                        | 20% ~13s          
  |+++++++++++                                       | 21% ~13s          
  |+++++++++++                                       | 22% ~13s          
  |++++++++++++                                      | 23% ~13s          
  |++++++++++++                                      | 24% ~13s          
  |+++++++++++++                                     | 25% ~12s          
  |+++++++++++++                                     | 26% ~12s          
  |++++++++++++++                                    | 27% ~12s          
  |++++++++++++++                                    | 28% ~12s          
  |+++++++++++++++                                   | 29% ~12s          
  |+++++++++++++++                                   | 30% ~12s          
  |++++++++++++++++                                  | 31% ~11s          
  |++++++++++++++++                                  | 32% ~11s          
  |+++++++++++++++++                                 | 33% ~11s          
  |+++++++++++++++++                                 | 34% ~11s          
  |++++++++++++++++++                                | 35% ~11s          
  |++++++++++++++++++                                | 36% ~11s          
  |+++++++++++++++++++                               | 37% ~10s          
  |+++++++++++++++++++                               | 38% ~10s          
  |++++++++++++++++++++                              | 39% ~10s          
  |++++++++++++++++++++                              | 40% ~10s          
  |+++++++++++++++++++++                             | 41% ~10s          
  |+++++++++++++++++++++                             | 42% ~10s          
  |++++++++++++++++++++++                            | 43% ~09s          
  |++++++++++++++++++++++                            | 44% ~09s          
  |+++++++++++++++++++++++                           | 45% ~09s          
  |+++++++++++++++++++++++                           | 46% ~09s          
  |++++++++++++++++++++++++                          | 47% ~09s          
  |++++++++++++++++++++++++                          | 48% ~09s          
  |+++++++++++++++++++++++++                         | 49% ~08s          
  |+++++++++++++++++++++++++                         | 50% ~08s          
  |++++++++++++++++++++++++++                        | 51% ~08s          
  |++++++++++++++++++++++++++                        | 52% ~08s          
  |+++++++++++++++++++++++++++                       | 53% ~08s          
  |+++++++++++++++++++++++++++                       | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 55% ~07s          
  |++++++++++++++++++++++++++++                      | 56% ~07s          
  |+++++++++++++++++++++++++++++                     | 57% ~07s          
  |+++++++++++++++++++++++++++++                     | 58% ~07s          
  |++++++++++++++++++++++++++++++                    | 59% ~07s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |+++++++++++++++++++++++++++++++                   | 62% ~06s          
  |++++++++++++++++++++++++++++++++                  | 63% ~06s          
  |++++++++++++++++++++++++++++++++                  | 64% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |++++++++++++++++++++++++++++++++++                | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=17s  
Calculating cluster 10

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |++                                                | 2 % ~20s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~19s          
  |+++                                               | 5 % ~19s          
  |++++                                              | 6 % ~18s          
  |++++                                              | 7 % ~18s          
  |+++++                                             | 8 % ~18s          
  |+++++                                             | 9 % ~18s          
  |++++++                                            | 10% ~17s          
  |++++++                                            | 11% ~17s          
  |+++++++                                           | 12% ~17s          
  |+++++++                                           | 13% ~17s          
  |++++++++                                          | 14% ~17s          
  |++++++++                                          | 15% ~16s          
  |+++++++++                                         | 16% ~16s          
  |+++++++++                                         | 18% ~16s          
  |++++++++++                                        | 19% ~16s          
  |++++++++++                                        | 20% ~16s          
  |+++++++++++                                       | 21% ~15s          
  |+++++++++++                                       | 22% ~15s          
  |++++++++++++                                      | 23% ~15s          
  |++++++++++++                                      | 24% ~15s          
  |+++++++++++++                                     | 25% ~15s          
  |+++++++++++++                                     | 26% ~14s          
  |++++++++++++++                                    | 27% ~14s          
  |++++++++++++++                                    | 28% ~14s          
  |+++++++++++++++                                   | 29% ~14s          
  |+++++++++++++++                                   | 30% ~14s          
  |++++++++++++++++                                  | 31% ~13s          
  |++++++++++++++++                                  | 32% ~13s          
  |+++++++++++++++++                                 | 33% ~13s          
  |++++++++++++++++++                                | 34% ~13s          
  |++++++++++++++++++                                | 35% ~13s          
  |+++++++++++++++++++                               | 36% ~12s          
  |+++++++++++++++++++                               | 37% ~12s          
  |++++++++++++++++++++                              | 38% ~12s          
  |++++++++++++++++++++                              | 39% ~12s          
  |+++++++++++++++++++++                             | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~11s          
  |++++++++++++++++++++++                            | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |++++++++++++++++++++++++                          | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |+++++++++++++++++++++++++                         | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |++++++++++++++++++++++++++                        | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |+++++++++++++++++++++++++++                       | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |+++++++++++++++++++++++++++++                     | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=19s  
Calculating cluster 11

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~09s          
  |++                                                | 2 % ~09s          
  |++                                                | 3 % ~08s          
  |+++                                               | 5 % ~08s          
  |+++                                               | 6 % ~08s          
  |++++                                              | 7 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |++++++++                                          | 16% ~07s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~06s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |+++++++++++++++++++++++++++                       | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 12

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~14s          
  |++                                                | 2 % ~13s          
  |++                                                | 3 % ~13s          
  |+++                                               | 4 % ~13s          
  |+++                                               | 5 % ~13s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 7 % ~13s          
  |+++++                                             | 9 % ~12s          
  |+++++                                             | 10% ~12s          
  |++++++                                            | 11% ~12s          
  |++++++                                            | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |+++++++                                           | 14% ~12s          
  |++++++++                                          | 15% ~11s          
  |++++++++                                          | 16% ~11s          
  |+++++++++                                         | 17% ~11s          
  |++++++++++                                        | 18% ~11s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 21% ~11s          
  |++++++++++++                                      | 22% ~10s          
  |++++++++++++                                      | 23% ~10s          
  |+++++++++++++                                     | 24% ~10s          
  |+++++++++++++                                     | 26% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |+++++++++++++++                                   | 30% ~09s          
  |++++++++++++++++                                  | 31% ~09s          
  |++++++++++++++++                                  | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |+++++++++++++++++++                               | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~08s          
  |++++++++++++++++++++                              | 38% ~08s          
  |++++++++++++++++++++                              | 39% ~08s          
  |+++++++++++++++++++++                             | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~07s          
  |+++++++++++++++++++++++                           | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |+++++++++++++++++++++++++++                       | 52% ~06s          
  |+++++++++++++++++++++++++++                       | 53% ~06s          
  |++++++++++++++++++++++++++++                      | 54% ~07s          
  |++++++++++++++++++++++++++++                      | 55% ~07s          
  |+++++++++++++++++++++++++++++                     | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |++++++++++++++++++++++++++++++                    | 60% ~06s          
  |+++++++++++++++++++++++++++++++                   | 61% ~06s          
  |+++++++++++++++++++++++++++++++                   | 62% ~06s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
Calculating cluster 13

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |+                                                 | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |++                                                | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |+++                                               | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |+++++                                             | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |++++++                                            | 12% ~07s          
  |+++++++                                           | 13% ~06s          
  |+++++++                                           | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |++++++++++                                        | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~05s          
  |+++++++++++++                                     | 26% ~05s          
  |++++++++++++++                                    | 27% ~05s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |+++++++++++++++++                                 | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |++++++++++++++++++                                | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |+++++++++++++++++++++++                           | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
# optional: save the cluster markers
write.csv(ClusterMarkers,"ClusterMarkers.csv")

See the top cluster markers

Now we can look at the cluster markers for cluster using EnrichR to compare to reference libraries



setEnrichrSite("Enrichr") # Human genes
Connection changed to https://maayanlab.cloud/Enrichr/
Connection is Live!
# list of all the databases

dbs <- listEnrichrDbs()

# this will list the possible libraries
dbs

# select libraries with cell types
db <- c('CellMarker_Augmented_2021','Azimuth_Cell_Types_2021')

Here is a small function to run easily on each cluster and find the cell type library predictions (specific to the libraries I selected)


checkCelltypes <- function(cluster_num = 0){
  clusterX <- ClusterMarkers %>% filter(cluster == cluster_num & avg_log2FC > 0.25)
  genes <- clusterX$gene
  # the cell type libraries
  # get the results for each library
  clusterX.cell <- enrichr(genes, databases = db)
  # visulize the results
print(plotEnrich(clusterX.cell[[1]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'CellMarker_Augmented_2021'))
print(plotEnrich(clusterX.cell[[2]], showTerms = 20, numChar = 40, y = "Count", orderBy = "P.value", title = 'Azimuth_Cell_Types_2021'))

}

Run the function for each cluster to see if we can identify cell types


cluster0 <- checkCelltypes(cluster_num = 0)
Uploading data to Enrichr... Done.
  Querying CellMarker_Augmented_2021... Done.
  Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.

Cluster 0 is likely immature neurons - possibly both Glutamatergic and gabaergic

cluster1 <- checkCelltypes(cluster_num = 1)
Uploading data to Enrichr... Done.
  Querying CellMarker_Augmented_2021... Done.
  Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.

Cluster 1 is astrocytes


checkCelltypes(cluster_num = 11)
Uploading data to Enrichr... Done.
  Querying CellMarker_Augmented_2021... Done.
  Querying Azimuth_Cell_Types_2021... Done.
Parsing results... Done.

After we have looked at all the clusters we add manual annotations


# we need to set the identity to rename
Idents(integrated_seurat) <- "integrated_snn_res.1"

# we need to make a vector of the cell type in the same order - in the cluster order

cell_types1 <- c("neurons_immature", "astrocytes_1","glia",
                 "neurons_mature","OPC","endothelial_1",
                 "endothelial_2","astrocyte_2","RadialGlia",
                 "neurons1","neurons_GABA","neurons2","neural_stem","DAneurons")
  
names(cell_types1) <- levels(integrated_seurat)
integrated_seurat <- RenameIdents(integrated_seurat, cell_types1)
integrated_seurat <- AddMetaData(object=integrated_seurat, metadata=Idents(integrated_seurat), col.name = "CellTypes")

Lets look at the annotations on the UMAP


DimPlot(integrated_seurat, group.by = "CellTypes", label = TRUE)

BREAK

Automated annotation We require reference data objects for both methods we will use

print("Developing Forebrain")
[1] "Developing Forebrain"
colnames(devforebrain@meta.data)
[1] "orig.ident"   "nCount_RNA"   "nFeature_RNA" "Sample"      
[5] "Level1"       "Age"          "Clusters"     "New"         
[9] "Celltypes"   
print("Developing cortex")
[1] "Developing cortex"
colnames(devcotex@meta.data)
 [1] "orig.ident"   "nCount_RNA"   "nFeature_RNA" "WGCNAcluster"
 [5] "Name"         "Age_in_Weeks" "RegionName"   "Laminae"     
 [9] "Area"         "Celltypes"   
print("Adult midbrain")
[1] "Adult midbrain"
colnames(midbrain@meta.data)
[1] "orig.ident"              "nCount_RNA"             
[3] "nFeature_RNA"            "Cell_Subtype"           
[5] "Cell_Type"               "disease__ontology_label"
[7] "organ__ontology_label"  

Seurat label transfer using find anchors - predicts cell types from a reference Seurat object

scClassify R weighted kNN https://doi.org/10.15252/msb.20199389 https://sydneybiox.github.io/scClassify/articles/scClassify.html

We need to make the reference and query objects into a “dgCMatrix” object

dim(dgCMat_ref)
[1] 60662  5311
dim(dgCMat_query)
[1] 19204  4028
class(dgCMat_ref)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"
class(dgCMat_query)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"

See the original cell type annotations

table(ref_celltypes)
ref_celltypes
 Neuroblast          RG   Glioblast          IN          EN 
        638        1097         365         952        1353 
        OPC   Microglia     Pre-OPC         NPC Endothelial 
         98          43         211         262          58 
    Neurons        VLMC           U 
         47          97          90 
table(query_clusters)
query_clusters
  0   1   2   3   4   5   6   7   8   9  10  11  12  13 
566 518 438 389 307 280 255 253 227 227 208 192  98  70 
length(ref_celltypes)
[1] 5311
length(query_celltypes)
[1] 4028

Run scClassify


scClassify_res <- scClassify(exprsMat_train = dgCMat_ref,
                             cellTypes_train = ref_celltypes,
                             exprsMat_test = dgCMat_query,
                             cellTypes_test = query_clusters,
                             tree = "HOPACH",
                             algorithm = "WKNN",
                             selectFeatures = c("limma"),
                             similarity = c("pearson"),
                             returnList = FALSE,
                             verbose = FALSE)
Warning in asMethod(object) :
  sparse->dense coercion: allocating vector of size 2.4 GiB


plotCellTypeTree(cellTypeTree(scClassify_res$trainRes))
Error in h(simpleError(msg, call)) : 
  error in evaluating the argument 'x' in selecting a method for function 'cellTypeTree': object 'scClassify_res' not found

See the cell type predictions by cluster


table(scClassify_res$testRes$test$pearson_WKNN_limma$predLabelMat,query_clusters)
Error in base::table(...) : all arguments must have the same length

Check another reference set


dgCMat_ref2 <- GetAssayData(ref2)
# get the cell type data
Idents(ref2) <- "Cell_Type" 
ref_celltypes2 <- Idents(ref2)
unique(ref_celltypes2)
[1] NaN   astro endo  mg    olig  nonda da    opc  
Levels: NaN astro endo mg olig nonda da opc
# check the object
dim(dgCMat_ref2)
[1] 41625  8000
class(dgCMat_ref2)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"
# predict the cluster cell types from the second reference
scClassify_res <- scClassify(exprsMat_train = dgCMat_ref2,
                             cellTypes_train = ref_celltypes2,
                             exprsMat_test = dgCMat_query,
                             cellTypes_test = query_clusters,
                             tree = "HOPACH",
                             algorithm = "WKNN",
                             selectFeatures = c("limma"),
                             similarity = c("pearson"),
                             returnList = FALSE,
                             verbose = FALSE)
Warning in asMethod(object) :
  sparse->dense coercion: allocating vector of size 2.5 GiB
Warning in pf(Fstat, df1 = df1, df2 = df2, lower.tail = FALSE, log.p = TRUE) :
  pbeta(*, log.p=TRUE) -> bpser(a=3999, b=37.9985, x=0.492658,...) underflow to -Inf
Warning in collap(data, level, d, dmat, newmed) :
  Not enough medoids to use newmed='medsil' in collap() - 

            using newmed='nn' instead 

Warning in pf(Fstat, df1 = df1, df2 = df2, lower.tail = FALSE, log.p = TRUE) :
  pbeta(*, log.p=TRUE) -> bpser(a=3999, b=38.7552, x=0.578758,...) underflow to -Inf
Warning: x or y has vectors with zero standard deviation; consider setting use_nan = TRUE to set these values to NaN or use_nan = FALSE to suppress this warning
Sys.time()
[1] "2023-04-21 22:19:08 EDT"

plotCellTypeTree(cellTypeTree(scClassify_res$trainRes))
Warning: Removed 7 rows containing missing values (`geom_text()`).

See the predictions by cluster

table(scClassify_res$testRes$test$pearson_WKNN_limma$predRes,query_clusters)
                                     query_clusters
                                        0   1   2   3   4   5   6   7   8   9  10
  astro                                 5 109 157   0 127 170  63 104  60   0   4
  da                                   51   0   0  13   0   0   2   0   0  17   5
  endo                                  6   0   1   1  13  29  28  59 101   0  10
  mg                                    0   0   0   0   0   0   1   0   0   0   0
  NaN_astro_endo_mg_olig_nonda_da_opc  79 148 155  16  91  74  93  69  60  14  47
  NaN_olig                              0   7   0   0   1   0   0   0   0   0   0
  nonda                               145   0   0 267   0   0   8   0   0  55  30
  nonda_da_opc                        226   0   1  83   0   0  25   0   0 135  46
  olig                                  0   2   0   0   1   0   0   0   0   0   0
  opc                                   1   0   3   1  18   0   6   0   0   1   7
                                     query_clusters
                                       11  12  13
  astro                                 1  49   4
  da                                    1   0   8
  endo                                  2   5   4
  mg                                    0   0   0
  NaN_astro_endo_mg_olig_nonda_da_opc  40  34  20
  NaN_olig                              0   0   0
  nonda                                39   0   4
  nonda_da_opc                         58   0  21
  olig                                  0   0   0
  opc                                  17   1   0
pred_counts <- table(scClassify_res$testRes$test$pearson_WKNN_limma$predRes,query_clusters)
# see predictions by cluster in a table
top.pred <- as.data.frame(pred_counts  %>% group_by(query_clusters)  %>% top_n(2, Freq)) %>% arrange(query_clusters, desc(Freq))
top.pred

Add prediction annotations

Adjust annotations - merge clusters or not

LS0tCnRpdGxlOiAic2NSTkFzZXEgV29ya2Zsb3ciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgd29ya2Jvb2sgaW5jbHVkZXM6CjEuIENyZWF0aW5nIGEgU2V1cmF0IG9iamVjdCBmcm9tIENlbGxSYW5nZXIgb3V0cHV0LgoyLiBQcmVwYXJpbmcgYW5kIGNsZWFuaW5nIHRoZSBkYXRhCiAgYSkgVmlzdWFsaXplIFFDCiAgYikgRmlsdGVyIG91dCB1bndhbnRlZCBjZWxscwogIGMpIElkZW50aWZ5IGFuZCByZW1vdmUgZG91YmxldHMKICBkKSBOb3JtYWxpemF0aW9uIGFuZCBzY2FsZQogIGUpIFNlbGVjdCBWYXJpYWJsZSBmZWF0dXJlcwozLiBNZXJnaW5nIGFuZCBIYXJtb25pemluZyBzYW1wbGVzCiAgYSkgTWVyZ2Ugc2FtcGxlcwogIGIpIFVzZSBTZXVyYXQgZmluZCBhbmNob3JzIHRvIGludGVncmF0ZQogIGMpIENvbXBhcmUgbWVyZ2VkIHZzIGludGVncmF0ZWQKNC4gRGltZW5zaW9uYWwgcmVkdWN0aW9uIGNsdXN0ZXJpbmcgYW5kIHZpc3VhbGl6YXRpb24KICBhKSBQQ0EgYW5kIGNvbXBvbmVudCBzZWxlY3Rpb24KICBiKSBVTUFQCiAgYykgQ2x1c3RlcmluZyBhbmQgdmlzdWFsaXphdGlvbgo1LiBDbHVzdGVyIGFubm90YXRpb24KICBhKSBWaXN1YWxpemUgZXhwcmVzc2lvbiBvZiBrbm93biBjZWxsIHR5cGUgbWFya2VycwogIGIpIEZpbmQgY2x1c3RlciBtYXJrZXJzIGFuZCBsb29rIHRoZW0gdXAgaW4gcmVmZXJlbmNlIGNlbGwgdHlwZSBsaWJyYXJ5CiAgYykgTWFudWFsIGNsdXN0ZXIgYW5ub3RhdGlvbiAKICBkKSBEZWNpc2lvbnMgb24gbWVyZ2luZyBjbHVzdGVycwo2LiBBdXRvbWF0ZWQgY2x1c3RlciBhbm5vdGF0aW9uCiAgYSkgU2V1cmF0IGxhYmVsIHRyYW5zZmVyCiAgYikgc2NDbGFzc2lmeQoKCiMgRXhhbXBsZSBkYXRhCldlIHdpbGwgdXNlIGRhdGEgZnJvbSBpUFNDIGRlcml2ZWQgbWlkYnJhaW4gb3JnYW5vaWRzClRoZXJlIGFyZSB0d28gc2FtcGxlcyBmcm9tIGRpc3NvY2lhdGVkIG1pZGJyYWluIG9yZ2Fub2lkcwoxKSBpUFNDIGxpbmUgZnJvbSBhIHBhdGllbnQgd2l0aCBQYXJraW5zb24ncyBEaXNlYXNlIGNhcnJ5aW5nIGEgdHJpcGxpY2F0aW9uIG9mIHRoZSBnZW5lIFNOQ0EKMikgVGhlIHNhbWUgaVBTQyBsaW5lIENSSVNQUiBjb3JyZWN0ZWQgdG8gbWFrZSBhbiBpc29nZW5lbmljIGNvbnRyb2wKCgojIEFuYWx5c2lzIHdvcmtmbG93CgpMb2FkIHlvdXIgcmVxdWlyZWQgbGlicmFyaWVzLgpZb3UgbmVlZCB0byBoYXZlIHRoZXNlIGxpYnJhcmllcyBhbHJlYWR5IGluc3RhbGxlZC4gCgpgYGB7cn0KU3lzLnRpbWUoKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoRG91YmxldEZpbmRlcikKbGlicmFyeShlbnJpY2hSKQpsaWJyYXJ5KGNsdXN0cmVlKQpsaWJyYXJ5KCJzY0NsYXNzaWZ5IikKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKbGlicmFyeSgiTWF0cml4IikKCgpgYGAKCgpMb2FkIHRoZSBkYXRhOiBTdGFydGluZyB3aXRoIHRoZSBjb250cm9sIGRhdGEuCgpgYGB7cn0KIyBsb2FkIGRhdGEKCiMgcmVhZCBpbiB0aGUgZGF0YSAtIENlbGxSYW5nZXIgb3V0cHV0IC0gYmFyY29kZXMsIGZlYXR1cmVzLCBleHByZXNzaW9uIG1hdHJpeAoKIyB5b3UgbmVlZCB0byBlbnRlciB0aGUgZmlsZSBwYXRoIHRvIHRoZSBmb2xkZXIgd2l0aCB0aGUgdGhyZWUgZmlsZXMKY29uX2RhdGEgPC0gUmVhZDEwWCgiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvQVNUMjNfQnJhaW5Db21tL0NlbGxSYW5nZXJPdXRzL0FTVDIzaXNvZ2VuaWMvcmF3X2ZlYXR1cmVfYmNfbWF0cml4IikKCiNMb29rIGF0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBtYXRyaXgKZGltKGNvbl9kYXRhKQoKI0xvb2sgYXQgYSBzbWFsbCBwYXJ0IG9mIHRoZSBkYXRhCmNvbl9kYXRhWzE6NSwgMTo1XQoKI0xvb2sgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIFVNSXMgcGVyIGNlbGwKY29sU3Vtcyhjb25fZGF0YSkgJT4lIHN1bW1hcnkKI0xvb2sgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIGdlbmVzIHBlciBjZWxsICAKY29sU3Vtcyhjb25fZGF0YSA+IDApICU+JSBzdW1tYXJ5CgoKYGBgCgoKUmVtb3ZlIGJhcmNvZGVzIHdpdGggdG9vIGZldyBnZW5lcyB0aGF0IGNvdWxkIGJlIGVtcHR5IGRyb3BsZXRzCgpgYGB7cn0KI1JlbW92ZSBiYXJjb2RlcyB3aXRoIGxlc3MgdGhhbiAxMDAgZ2VuZXMgZGV0ZWN0ZWQgKHlvdSBjYW4gc2VsZWN0IGEgZGlmZmVyZW50IHZhbHVlIGhlcmUpCiMgd2l0aG91dCAKY29uX2RhdGEgPC0gY29uX2RhdGFbLCBjb2xTdW1zKGNvbl9kYXRhID4gMCk+IDEwMF0KZGltKGNvbl9kYXRhKQoKCmBgYAoKCkZpbHRlciBnZW5lcyBhbmQgY3JlYXRlIGEgU2V1cmF0IG9iamVjdAoKCmBgYHtyfQojV2UgbWlnaHQgbm90IHdhbnQgdG8gaW5jbHVkZSBnZW5lcyB0aGF0IG9jY3VyIGluIGZldyBjZWxscyBhcmUgbm8gY2VsbHMuICBIZXJlIHdlIHdpbGwgZmlsdGVyIG91dCBnZW5lcy90cmFuc2NyaXB0cyB0aGF0IGFyZSBpbiBsZXNzIHRoYW4gMyBjZWxscy4gCiMgeW91IGRvbid0IGhhdmUgdG8gZmlsdGVyIGFueSBnZW5lcyB5b3UgY2FuIGFsc28gY2hhbmdlIHRvIGFueSBmaWx0ZXIgdGhyZXNob2xkIHlvdSB3YW50CgojTWFrZSBhIFNldXJhdCBvYmplY3QKI1JlbW92aW5nIGFueSBnZW5lcyBkZXRlY3RlZCBpbiBsZXNzIHRoYW4gMyBjZWxscwoKIyB3ZSBjYW4gYWxzbyBmaWx0ZXIgY2VsbHMgYXQgdGhpcyBzdGFnZSB0b28uIApjb25fc2V1IDwtIENyZWF0ZVNldXJhdE9iamVjdChjb25fZGF0YSwgcHJvamVjdCA9ICJDb250cm9sIiwgbWluLmNlbGxzID0gMykKIyBsb29rIGF0IHRoZSBvYmplY3QgZGltZW5zaW9ucwpjb25fc2V1CgpgYGAKCgpEYXRhIGRpc3RyaWJ1dGlvbgpgYGB7cn0KIyBsb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdG90YWwgY291bnRzIG9mIFJOQSBhY3Jvc3MgY2VsbHMKY29uX3NldSRuQ291bnRfUk5BICU+JSBzdW1tYXJ5CgojIGxvb2sgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB1bmlxdWUgUk5BIHRyYW5zY3JpcHRzIGFjcm9zcyBjZWxscwoKY29uX3NldSRuRmVhdHVyZV9STkEgJT4lIHN1bW1hcnkKCmBgYAoKClZpc3VhbGl6ZSB0aGUgZGlzdHJpYnV0aW9ucwoKYGBge3J9CgpWbG5QbG90KGNvbl9zZXUsIGZlYXR1cmVzID0gYygibkNvdW50X1JOQSIsIm5GZWF0dXJlX1JOQSIpLCBwdC5zaXplID0gMCkKCmBgYAoKRmlsdGVyIG91dCB1bndhbnRlZCBjZWxscwoKYGBge3J9CiMgRXhhbXBsZSBjZWxsIGZpbHRlcmluZyBiYXNlZCBvbiBtaXRvY2hvbmRyaWFsIGNvdW50IHBlcmNlbnRhZ2UgYW5kIG51bWJlciBvZiBVTUlzIC0tLS0tLS0tLS0KCiNDYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2Ugb2YgUk5BIGVuY29kZWQgbWl0b2Nob25kcmlhbCBnZW5lcyBmcm9tIHRoZSBtaXRvY2hvbmRyaWFsIEROQQpjb25fc2V1IDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KGNvbl9zZXUsIHBhdHRlcm4gPSAiXk1ULSIsIGNvbC5uYW1lID0gInBlcmNlbnQuTVQiKQpjb25fc2V1JHBlcmNlbnQuTVQgJT4lIHN1bW1hcnkKClZsblBsb3QoY29uX3NldSwgZmVhdHVyZXMgPSAicGVyY2VudC5NVCIsIHB0LnNpemUgPSAwLjAwMSkKCmBgYApOb3cgd2Ugd2lsbCBmaWx0ZXIgc29tZSBjZWxscyB3aXRoIHRvbyBoaWdoIG1pdG9jaG9uZHJpYWwgUk5BCkZpbHRlciBvdXQgY2VsbHMgd2l0aCB0b28gbWFueSBSTkEgcmVhZHMgLSB0aGVzZSBhcmUgbGlrZWx5IGRvdWJsZXRzCgpgYGB7cn0KCgojUmVtb3ZlIGFueSBjZWxscyB3aXRoIG1vcmUgdGhhbiAyMCUgbWl0b2Nob25kcmlhbCBjb3VudHMKY29uX3NldS5mdCA8LSBzdWJzZXQoY29uX3NldSwgcGVyY2VudC5NVCA8IDIwKQoKI1JlbW92ZSBjZWxscyB3aXRoIHZlcnkgaGlnaCBVTUkgY291bnRzLCB3aGljaCBtYXkgYmUgcG9zc2libGUgbXVsdGlwbGV0cwpjb25fc2V1LmZ0IDwtIHN1YnNldChjb25fc2V1LmZ0LCBuQ291bnRfUk5BIDwgMjAwMDApCgojIHNlZSB0aGUgcmVzdWx0cwpWbG5QbG90KGNvbl9zZXUsIGZlYXR1cmVzID0gYygicGVyY2VudC5NVCIsICJuQ291bnRfUk5BIiwgIm5GZWF0dXJlX1JOQSIpLCBwdC5zaXplID0gMC4wMDEpCgojIGNoZWNrIGhvdyBtYW55IGNlbGxzIHdlIGhhdmUKY29uX3NldS5mdAoKYGBgCgpXZSBtaWdodCB3YW50IHRvIGZpbHRlciBtb3JlIGNlbGxzIHdpdGggbG93IHRvdGFsIGFuZC9vciB1bmlxdWUgUk5BCgpgYGB7cn0KCiMgdHJ5IHNvbWUgZGlmZmVyZW50IGZpbHRlcmluZyBvcHRpb25zCgoKYGBgCgpBcHBseSBmaW5hbCBmaWx0ZXJpbmcgY29uZGl0aW9ucwpgYGB7cn0KCmNvbl9zZXVfZnQgPC0gc3Vic2V0KGNvbl9zZXUsIG5Db3VudF9STkEgPCA2MDAwMCAmIG5GZWF0dXJlX1JOQSA+IDUwMCAmIAogICAgICAgICAgICAgICAgICAgICBwZXJjZW50Lk1UIDwgMjApCgpkaW0oY29uX3NldV9mdCkKCmBgYAoKQ2xlYXIgZXh0cmEgZGF0YSBvYmplY3Qgd2UgZG9uJ3QgbmVlZCBhbnltb3JlCgpgYGB7cn0KCnJtKGNvbl9kYXRhLGNvbl9zZXUuZnQpCgpgYGAKCgpOb3JtYWxpemluZyAKCmBgYHtyfQojIE5vcm1hbGl6ZSBkYXRhIChsb2cgbm9ybWFsaXphdGlvbikgYW5kIHNlbGVjdCBnZW5lcyB3aXRoIHZhcmlhYmxlIGV4cHJlc3Npb24gYWNyb3NzIGNlbGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjb25fc2V1X2Z0IDwtIE5vcm1hbGl6ZURhdGEoY29uX3NldV9mdCwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiTG9nTm9ybWFsaXplIiwgc2NhbGUuZmFjdG9yID0gMTAwMDApCgojQ2hlY2sgb3V0IHRoZSBlZmZlY3Qgb2Ygbm9ybWFsaXphdGlvbgpHZXRBc3NheURhdGEoY29uX3NldV9mdCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJkYXRhIikgJT4lIGV4cG0xICU+JSBjb2xTdW1zICU+JSBoZWFkCkdldEFzc2F5RGF0YShjb25fc2V1X2Z0LCBhc3NheSA9ICJSTkEiLCBzbG90ID0gImNvdW50cyIpICU+JSBjb2xTdW1zICU+JSBoZWFkCgpgYGAKCkZpbmRpbmcgVmFyaWFibGUgZmVhdHVyZXMgCmBgYHtyfQojIHRocmVlIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBjaG9vc2UgdmFyaWFibGUgZmVhdHVyZXMgaW4gdGhpcyBmdW5jdGlvbgojIG91ciBzZWxlY3Rpb24gbWV0aG9kIGlzIHZzdApjb25fc2V1X2Z0IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKGNvbl9zZXVfZnQsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKCgp2YXIgIDwtIFZhcmlhYmxlRmVhdHVyZXMoY29uX3NldV9mdCkKVmFyaWFibGVGZWF0dXJlUGxvdChjb25fc2V1X2Z0KQp2YXJbMToxMF0KCmBgYAoKRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIFBDQSBhbmQgVU1BUAoKYGBge3J9CiNTY2FsaW5nIGlzIHJlY29tbWVuZGVkIGJlZm9yZSBQQ0EsIGFzIG90aGVyd2lzZSBoaWdobHkgZXhwcmVzc2VkIGdlbmVzIHdpbGwgaGF2ZSBhIGRpc3Byb3BvcnRpb25hdGUgZWZmZWN0IG9uIHRoZSBQQyBjb21wb3NpdGlvbgoKIyB3ZSBhcmUgYWxzbyByZWdyZXNzaW5nIE1UIGdlbmVzIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIFBDQQpjb25fc2V1X2Z0IDwtIFNjYWxlRGF0YShjb25fc2V1X2Z0LCB2YXJzLnRvLnJlZ3Jlc3MgPSAicGVyY2VudC5NVCIpCmNvbl9zZXVfZnRAYXNzYXlzJFJOQUBzY2FsZS5kYXRhICU+JSBkaW0KCiNMaW5lYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uCiNDaG9vc2luZyB0aGUgbnVtYmVyIG9mIFBDcyBjYW4gZGVwZW5kIG9uIGhvdyBtYW55IGNlbGxzIHlvdSBoYXZlCmNvbl9zZXVfZnQgPC0gUnVuUENBKGNvbl9zZXVfZnQsIGFzc2F5ID0gIlJOQSIsIG5wY3MgPSAzMCkKClBDQVBsb3QoY29uX3NldV9mdCkKCiNBc3Nlc3MgaG93IG1hbnkgUENzIGNhcHR1cmUgbW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgCkVsYm93UGxvdChjb25fc2V1X2Z0LCBuZGltcyA9IDMwKQoKYGBgCgpXZSB3b24ndCBydW4gdGhpcyBjb2RlCkkndmUgaW5jbHVkZWQgdGhpcyBhbmFseXNpcyB0aGF0IGNhbGN1bGF0ZXMgdGhlIGN1dC1vZmYgZm9yIHNpZ25pY2FuY2Ugb2YgY29tcG9uZW50IG51bWJlcnMuICBIb3dldmVyIHRoZSBmdW5jdGlvbiBydW5zIG11bHRpcGxlIGl0ZXJhdGlvbnMgb2YgdGhlIFBDQSBhbmQgd2lsbCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJ1bi4gCgpgYGB7cn0KIyBKYWNrc3RyYXcKCiNBc3Nlc3MgaG93IG1hbnkgUENzIGNhcHR1cmUgbW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgCnNldSA8LUphY2tTdHJhdyhzZXUsIHJlZHVjdGlvbiA9ICJwY2EiLAogIGRpbXMgPSAzMCkKc2V1IDwtIFNjb3JlSmFja1N0cmF3KHNldSwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQpKYWNrU3RyYXdQbG90KHNldSwgZGltcyA9IDE6MzApCgpgYGAKCgpOb24tbGluZWFyIGRpbWVuc2lvbmFsIHJlZHVjdGlvbiB1c2luZyBVTUFQCmBgYHtyfQoKI05vbi1saW5lYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uCiNDaG9vc2luZyBob3cgbWFueSBQQ3MgdG8gaW5wdXQgY2FuIGRlcGVuZCBvbiB0aGUgZWxib3cgcGxvdCBhbmQgb24gdGhlIG51bWJlciBvZiBjZWxscwojVGhlcmUgYXJlIG1hbnkgcGFyYW1ldGVycyB0aGF0IGNhbiBlIHR3ZWFrZWQgYW5kIG9wdGltaXplZCBpbiBhIFVNQVAgcGxvdAojWW91IGNhbiBzZWUgc29tZSBkZW1vcyBoZXJlOiBodHRwczovL3BhaXItY29kZS5naXRodWIuaW8vdW5kZXJzdGFuZGluZy11bWFwLwpjb25fc2V1X2Z0IDwtIFJ1blVNQVAoY29uX3NldV9mdCwgZGltcyA9IDE6MTgpClVNQVBQbG90KGNvbl9zZXVfZnQpCgoKYGBgCgoKRG91YmxldCBpZGVudGlmaWNhdGlvbgoKYGBge3J9CgojIEFzc2VzcyBwb3NzaWJsZSBkb3VibGV0cyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI1VzaW5nIGluc3RydWN0aW9ucyBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXMtbWNnaW5uaXMtdWNzZi8KCiNGaXJzdCB3ZSBoYXZlIHRvIGZpbmQgYSBwSyB3aGljaCBkZXRlcm1pbmVzIGhvdyBiaWcgb2YgYSBuZWlnaGJvcmhvb2Qgd2lsbCBiZSBleGFtaW5lZCBmb3IgZG91YmxldHMKI1RoaXMgc2hvdWxkIGJlIGNob3NlbiBmb3IgZWFjaCBsaWJyYXJ5IHNlcGFyYXRlbHkKI0ZpcnN0IHdlIHRlc3QgYSBudW1iZXIgb2YgcE4gKHByb3BvcnRpb24gb2YgZ2VuZXJhdGVkIGFydGlmaWNpYWwgZG91YmxldHMpIGFuZCBwSwojV2UgZ2V0IGRpZmZlcmVudCBsaXN0cyBvZiBwcm9iYWJpbGl0aWVzIG9mIGFydGlmaWNhbCBuZWFyZXN0IG5laWdoYm9ycyB3aXRoIHRoZXNlIHRlc3RlZCBwYXJhbWV0ZXJzCiNBbHNvIGtlZXAgaW4gbWluZCB0aGUgcmVzdWx0cyBhcmUgbm90IGRldGVybWluaXN0aWMgKGV2ZXJ5IHJ1biB3aWxsIGdpdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHJlc3VsdHMpCnN3ZWVwLnJlcy5jb24gPC0gcGFyYW1Td2VlcF92Myhjb25fc2V1X2Z0LCBQQ3MgPSAxOjE4LCBzY3QgPSBGQUxTRSkKCiNXZSBkbyBub3QgaGF2ZSB0aGUgImdyb3VuZCB0cnV0aCIgcmVnYXJkaW5nIGRvdWJsZXRzLCBzdWNoIGZyb20gZnJvbSBnZW5vdHlwZSBkYXRhIGZvciBwb29sZWQgc2FtcGxlcyAKI1dlIHN1bWFtcml6ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIHJhbmdlIG9mIHBOPXBLIHBhcmFtZXRlcnMgd2UgdGVzdGVkCnN3ZWVwLnN0YXRzX2NvbiA8LSBzdW1tYXJpemVTd2VlcChzd2VlcC5yZXMuY29uLCBHVCA9IEZBTFNFKQoKI0hlcmUgdGhlICJiZXN0IiBwSyBmb3IgdGhlIGRhdGEgaXMgY2hvc2VuIGJhc2VkIG9uIGEgbWV0cmljIGRldGVybWluZWQgYnkgdGhlIERvdWJsZXRGaW5kZXIgZGV2ZWxvcGVycwojV2hpY2ggcGVyZm9ybXMgYmVzdCBpbiBkYXRhc2V0cyB3aGVyZSB0aGUgZ3JvdW5kIHRydXRoIGlzIGtub3duCmJjbXZuX2NvbiA8LSBmaW5kLnBLKHN3ZWVwLnN0YXRzX2NvbikKZ2dwbG90KGJjbXZuX2NvbiwgYWVzKHggPSBwSywgeSA9IEJDbWV0cmljLCBncm91cCA9ICJTd2VlcCIpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgpgYGB7cn0KCiNXZSB3aWxsIHBpY2sgcEsgPSAwLjA4CiNXZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBvdXIgY2x1c3RlcmluZyBpbmZvcm1hdGlvbiB0byBlc3RpbWF0ZSAiaG9tb3R5cGljIiBkb3VibGV0cwojV2UgYXJlIHNpbXBseSBnb2luZyB0byB1c2UgYW4gZXhwZWN0ZWQgZG91YmxldCBmb3JtYXRpb24gcmF0ZSBvZiAyLjUlIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3RhcnRpbmcgY2VsbHMgbG9hZGVkCgpuRXhwX3BvaSA8LSByb3VuZCgwLjAyNSpucm93KGNvbl9zZXVfZnRAbWV0YS5kYXRhKSkKY29uX3NldV9mdCA8LSBkb3VibGV0RmluZGVyX3YzKGNvbl9zZXVfZnQsIFBDcyA9IDE6MTgsIHBOID0gMC4yNSwgcEsgPSAwLjA4LCBuRXhwID0gbkV4cF9wb2ksIHJldXNlLnBBTk4gPSBGQUxTRSwgc2N0ID0gRkFMU0UpCgojSGVyZSB3ZSB1cGRhdGUgdGhlIFNldXJhdCBvYmplY3QgdmVyc2lvbiBqdXN0IGluIGNhc2UgdGhlIG9uZSByZXR1cm5lZCBieSBEb3VibGV0RmluZGVyIGlzIGFuIG9sZGVyIHZlcnNpb24KY29uX3NldV9mdCA8LSBVcGRhdGVTZXVyYXRPYmplY3QoY29uX3NldV9mdCkKCiMgd2UgaGF2ZSBub3cgaWRlbnRpZmllZCBkb3VibGV0cyBidXQgd2UgaGF2ZSBub3QgcmVtb3ZlZCB0aGVtCgoKYGBgCgpWaXN1YWxpemUgdGhlIGRvdWJsZXQgcmVtb3ZhbCByZXN1bHRzCgpgYGB7cn0KCiMgd2UgbmVlZCB0byBsb29rIGluIHRoZSBkYXRhIG9iamVjdAoKI1Zpc3VhbGl6ZSBhbmQgYXNzZXNzIHRoZSBjZWxscyBjYWxsZWQgYXMgcHJvYmFibGUgZG91YmxldHMKVU1BUFBsb3QoY29uX3NldV9mdCwgZ3JvdXAuYnkgPSAiREYuY2xhc3NpZmljYXRpb25zXzAuMjVfMC4wOF83MyIpCgojIHRhYmxlIG9mIGRvdWJsZXRzIGFuZCBzaWdubGV0cwpjb25fc2V1X2Z0JERGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMgJT4lIHRhYmxlCgojIHZpc3VhbGl6ZSB0aGUgZmVhdHVyZXMgaW4gZG91YmxldHMgYW5kIHNpbmdsZXRzClZsblBsb3QoY29uX3NldV9mdCwgZmVhdHVyZXMgPSBjKCJuQ291bnRfUk5BIiwgIm5GZWF0dXJlX1JOQSIsICJwZXJjZW50Lk1UIiwgInBBTk5fMC4yNV8wLjA4XzczIiksIAogICAgICAgIGdyb3VwLmJ5ID0gIkRGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMiLCBwdC5zaXplID0gMC4wMDEsIG5jb2wgPSAyLCBsb2cgPSBUUlVFKQoKYGBgCgpgYGB7cn0KIyByZW1vdmUgdGhlIGRvdWJsZXRzCiMgd2UgY2FuIGRvIHRoaXMgYnkgc3Vic2V0CiMgZmlyc3Qgd2UgbmVlZCB0byBzZXQgdGhlIGFjdGl2ZSBtZXRhIGRhdGEgc2xvdCB0byB0aGUgZG91YmxldCBpZGVudGlmaWNhdGlvbgpJZGVudHMoY29uX3NldV9mdCkgPC0gIkRGLmNsYXNzaWZpY2F0aW9uc18wLjI1XzAuMDhfNzMiCiMgd2Ugc2VsZWN0IG9ubHkgdGhlIHNpbmdsZXQgY2VsbHMKY29uX3NldV9mdDIgPC0gc3Vic2V0KGNvbl9zZXVfZnQsIGlkZW50cyA9ICJTaW5nbGV0IikKZGltKGNvbl9zZXVfZnQpCmRpbShjb25fc2V1X2Z0MikKCmBgYAoKCgoKUmVwZWF0IHRoZSBhYm92ZSBzdGVwcyBmb3IgdGhlIFNOQ0EgdHJpcGxpY2F0aW9uIHBhdGllbnQgbGluZQoKYGBge3J9CiMgcmVhZCBpbiBkYXRhCgphc3RfZGF0YSA8LSBSZWFkMTBYKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9BU1QyM19CcmFpbkNvbW0vQ2VsbFJhbmdlck91dHMvQVNUMjMvcmF3X2ZlYXR1cmVfYmNfbWF0cml4IikKCgojIGNyZWF0ZSBzZXVyYXQgb2JqZWN0CgoKIyBmaWx0ZXIgb2JqZWN0IHdpdGggdGhlIHNhbWUgc2V0dGluZ3MgYXMgd2l0aCB0aGUgY29udHJvbAoKCiMgUENBIGFuYWx5c2lzCgojIFJlbW92ZSBkb3VibGV0cwoKCgpgYGAKCgpgYGB7cn0KIyBjbGVhbiB1cCAKcm0oYXN0X2RhdGEsYXN0X3NldV9mdCxiY212bl9hc3QsYmNtdm5fY29uLGNvbl9zZXVfZnQsIHN3ZWVwLnJlcy5hc3QsIHN3ZWVwLnJlcy5jb24sIHN3ZWVwLnN0YXRzX2FzdCwgc3dlZXAuc3RhdHNfY29uKQpgYGAKCgojIEJSRUFLCgpNZXJnZSBkYXRhIG9iamVjdHMKCmBgYHtyfQoKbWVyZ2Vfc2V1cmF0IDwtIG1lcmdlKGNvbl9zZXVfZnQyLGFzdF9zZXVfZnQyKQptZXJnZV9zZXVyYXQKCnVuaXF1ZShtZXJnZV9zZXVyYXQkb3JpZy5pZGVudCkKCgpgYGAKCkZpbmQgYW5jaG9ycyBiZXR3ZWVuIHRoZSB0d28gZGF0YSBvYmplY3RzCmBgYHtyfQpzYW1wbGUubGlzdCA8LSBTcGxpdE9iamVjdChtZXJnZV9zZXVyYXQsIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiKQoKIyBXZSBoYXZlIGFscmVhZHkgbm9ybWFsaXplZCBhbmQgaWRlbnRpZmllZCB2YXJpYWJsZSBmZWF0dXJlcyBpbiBlYWNoIHNhbXBsZQojIElmIHdlIGhhZCBub3QgZG9uZSBzbyB3ZSBjYW4gbm9ybWFsaXplIGhlcmUKI2ZvciAoaSBpbiAxOmxlbmd0aChzYW1wbGUubGlzdCkpewogIyBvcmcubGlzdFtbaV1dIDwtIE5vcm1hbGl6ZURhdGEob3JnLmxpc3RbW2ldXSwgdmVyYm9zZSA9IEZBTFNFKQogICNvcmcubGlzdFtbaV1dIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKG9yZy5saXN0W1tpXV0sIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IikKI30KCiMgTm93IHdlIGZpbmQgZmVhdHVyZXMgdGhhdCBjYW4gYWN0IGFzIGFuY2hvcnMgYmV0d2VlbiB0aGUgdHdvIHNhbXBsZXMKaW50LmFuY2hvcnMgPC0gRmluZEludGVncmF0aW9uQW5jaG9ycyhvYmplY3QubGlzdCA9IHNhbXBsZS5saXN0LCBkaW1zID0gMTo1MCkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gSW50ZWdyYXRlRGF0YShhbmNob3JzZXQgPSBpbnQuYW5jaG9ycywgZGltcyA9IDE6NTApCgpgYGAKCgpPcHRpb25hbDogc2F2ZSB0aGUgaW50ZWdyYXRlZCBvYmplY3Qgb3IgcmVhZCBpbiB0aGUgSW50ZWdyYXRlZCBvYmplY3QgZm9yIHRoZSBuZXh0IHN0ZXAuCgpgYGB7cn0KIyByZW1vdmUgIyBjb21tZW50IGZyb20gdGhlIGNvZGUgeW91IHdhbnQgdG8gcnVuCgpzYXZlUkRTKGludGVncmF0ZWRfc2V1cmF0LCJJbnRlZ3JhdGVkU2V1cmF0LlJEUyIpCiNpbnRlZ3JhdGVkX3NldXJhdGUgPC0gcmVhZFJEUygiSW50ZWdyYXRlZFNldXJhdC5SRFMiKQoKYGBgCgpQQ0EgYW5kIFVNQVAgb24gdGhlIG1lcmdlZCBvYmplY3QKCmBgYHtyfQojIG1lcmdlZCBvYmplY3QKCkRlZmF1bHRBc3NheShtZXJnZV9zZXVyYXQpIDwtICJSTkEiCgptZXJnZV9zZXVyYXQgPC0gU2NhbGVEYXRhKG1lcmdlX3NldXJhdCwgdmVyYm9zZSA9IEZBTFNFKQojIGluIHRoZSBtZXJnZSBkYXRhIHNldCB3ZSBzaWxsIG5lZWQgZmVhdHVyZXMgZm9yIHRoZSBQQ0EgaW5wdXQKbWVyZ2Vfc2V1cmF0IDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKG1lcmdlX3NldXJhdCwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiKQptZXJnZV9zZXVyYXQgPC0gUnVuUENBKG1lcmdlX3NldXJhdCwgbnBjcyA9IDMwLCB2ZXJib3NlID0gRkFMU0UpCm1lcmdlX3NldXJhdCA8LSBSdW5VTUFQKG1lcmdlX3NldXJhdCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQoKCmBgYAoKCgpSZXBlYXQgUENBIGFuZCBVTUFQIGZvciB0aGUgaW50ZWdyYXRlZCBvYmplY3QKCmBgYHtyfQpJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkIgppbnRlZ3JhdGVkX3NldXJhdCA8LSBTY2FsZURhdGEoaW50ZWdyYXRlZF9zZXVyYXQsIHZlcmJvc2UgPSBGQUxTRSkKIyBvbmx5IHRoZSBpbnRlZ3JhdGVkIGZlYXR1cmVzIHdpbGwgYmUgdGhlIHBjYSBpbnB1dAoKaW50ZWdyYXRlZF9zZXVyYXQgPC0gUnVuUENBKGludGVncmF0ZWRfc2V1cmF0LCBucGNzID0gMzAsIHZlcmJvc2UgPSBGQUxTRSkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gUnVuVU1BUChpbnRlZ3JhdGVkX3NldXJhdCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjMwKQoKYGBgCgoKT3B0aW9uYWw6IHNhdmUgdGhlIFBDQSBhbmQgVU1BUCBpbnRlZ3JhdGVkIG9iamVjdCBvciByZWFkIGluIHRoZSBzYXZlZCBvYmplY3QKYGBge3J9CiMgcmVtb3ZlICMgY29tbWVudCBmcm9tIHRoZSBjb2RlIHlvdSB3YW50IHRvIHJ1bgpzYXZlUkRTKGludGVncmF0ZWRfc2V1cmF0LCJJbnRlZ3JhdGVkU2V1cmF0R3JhcGhzLlJEUyIpCiNpbnRlZ3JhdGVkX3NldXJhdCA8LSByZWFkUkRTKCJJbnRlZ3JhdGVkU2V1cmF0R3JhcGhzLlJEUyIpCgpgYGAKCkxldCdzIGxvb2sgYXQgdGhlIFVNQVBzIGZyb20gdGhlIG1lcmdlZCB2cyB0aGUgaW50ZWdyYXRlZCBkYXRhCmBgYHtyfQoKcDEgPC0gRGltUGxvdChtZXJnZV9zZXVyYXQsIGdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiKSArIGdndGl0bGUoIk1lcmdlIikKcDIgPC0gRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIpICsgZ2d0aXRsZSgiSW50ZWdyYXRlZCIpCgpwMQpwMgoKYGBgCldlIHNlZSBhbG1vc3Qgbm8gZGlmZmVyZW5jZSBpbiB0aGlzIGRhdGEuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGluIGFsbCBkYXRhIHNldHMKCkNsdXN0ZXIgdGhlIGludGVncmF0ZWQgZGF0YQoKYGBge3J9CiMgc2VlIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBwY2EgY29tcG9uZW50cwpFbGJvd1Bsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIG5kaW1zPTMwKQppbnRlZ3JhdGVkX3NldXJhdAoKYGBgCgpgYGB7cn0KZGltKGludGVncmF0ZWRfc2V1cmF0KQoKYGBgCgpXZSB3aWxsIGNob29zZSAyMCBQQ3MKVGhlcmUgYXJlIDQwMjggY2VsbHMuICBBIGNvbW1vbiBydWxlIG9mIHRodW1iIGZvciBjaG9vc2luZyBrIGZvciBuZWFyZXN0IG5laWdoYm91cnMgaXMgdXNpbmcgdGhlIHNxdWFyZSByb290IG9mIHRoZSBudW1iZXIgb2YgY2VsbHMgPSA2MwoKYGBge3J9CiMgY2FsY3VsYXRlIHRoZSBzcXVhcmUgcm9vdApzcXJ0KDQwMjgpCgojIHRoZSBLIHBhcmFtZXRlciBjaGFuZ2VzIHRoZSBzaXplIG9mIGNsdXN0ZXJzIGJ5IGNoYW5naW5nIHRoZSBzdGFydGluZyBub2RlcyBpbnB1dCBpbnRvIHRoZSBMb3V2YWluIG5ldHdvcmsKCmludGVncmF0ZWRfc2V1cmF0IDwtIEZpbmROZWlnaGJvcnMoaW50ZWdyYXRlZF9zZXVyYXQsIGRpbXMgPSAxOjIwLCBrLnBhcmFtID0gNjMpCiMgdGhlIG51bWJlciBvZiBjbHVzdGVycyBpcyBkZXBlbmRlbnQgb24gdGhlIHJlc29sdXRpb24gYSBudW1iZXIgZnJvbSAwLTIuIAojIEhpZ2hlciB2YWx1ZXMgbWFrZSBtb3JlIGNsdXN0ZXJzCiMgd2UgaW5jbHVkZSAKaW50ZWdyYXRlZF9zZXVyYXQgPC0gRmluZENsdXN0ZXJzKGludGVncmF0ZWRfc2V1cmF0LCByZXNvbHV0aW9uID0gYygwLDAuMDUsMC4yNSwwLjQsMC41LDAuNiwxLDEuNSkgKQoKIyB3ZSBjYW4gdmlzdWFsaXplIHdoaWNoIGNlbGxzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucyB1c2luZyBjbHVzdHJlZQoKY2x1c3RyZWUoaW50ZWdyYXRlZF9zZXVyYXQsIHByZWZpeCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuIikKCmBgYAoKClZpc3VhbGl6ZSB0aGUgVU1BUCBvZiB0aGUgZGlmZmVyZW50IGNsdXN0ZXIgcmVzb2x1dGlvbnMKYGBge3J9CnJlcyA8LSBjKDAuMDUsMC4yNSwwLjQsMC41LDAuNiwxLDEuNSkKcmVzb2x1dGlvbnMgPC0gcGFzdGUoImludGVncmF0ZWRfc25uX3Jlcy4iLCByZXMsIHNlcD0iIikKcmVzb2x1dGlvbnMKCmZvcihyIGluIHJlc29sdXRpb25zKXsKICBwcmludChEaW1QbG90KGludGVncmF0ZWRfc2V1cmF0LCBncm91cC5ieSA9IHIpKQp9CgoKYGBgCgojIEJSRUFLCgoKTm93IHdlIG5lZWQgdG8gY2hvb3NlIGEgcmVzb2x1dGlvbiB0byBhbm5vdGF0ZS4KSSB3aWxsIHNlbGVjdCByZXNvbHV0aW9uIG9mIDAuNi4KCmBgYHtyfQojIFNjYWxlIHRoZSB0b3RhbCBSTkEKIyBiZWZvcmUgd2Ugb25seSBzY2FsZWQgdGhlIGludGVncmF0ZWQgZXhwcmVzc2lvbiBmb3IgdGhlIGdlbmVzIHVzZWQgZm9yIGludGVncmF0aW9uCiMgbm93IHdlIHdhbnQgdG8gc2NhbGUgYWxsIGdlbmVzCgpEZWZhdWx0QXNzYXkoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJSTkEiCmludGVncmF0ZWRfc2V1cmF0IDwtIFNjYWxlRGF0YShpbnRlZ3JhdGVkX3NldXJhdCkKCgpgYGAKCgoKTG9vayBhdCBrbm93biBjZWxsIHR5cGUgbWFya2VycwoKYGBge3J9CiMgZmVhdHVyZXMgbGlzdCBmcm9tIGxpdGVyYXR1cmUKCmRhX25ldXJvbnMgPC0gYygiVEgiLCJTTEM2QTMiLCJTTEMxOEEyIiwiU09YNiIsIk5ETkYiLCJTTkNHIiwiQUxESDFBMSIsIkNBTEIxIiwiVEFDUjIiLCJTTEMxN0E2IiwiU0xDMzJBMSIsIk9UWDIiLCJHUlAiLCJMUEwiLCJDQ0siLCJWSVAiKQpOUENfb3JTdGVtTGlrZSA8LSBjKCJEQ1giLCJORVVST0QxIiwiVEJSMSIsIlBDTkEiLCJNS0k2NyIsIlNPWDIiLCJORVMiLCJQQVg2IiwiTUFTSDEiKQptYXR1cmVfbmV1cm9ucyA9IGMoIlJCRk9YMyIsIlNZUCIsIkRMRzQ1IiwiVkFNUDEiLCJWQU1QMiIsIlRVQkIzIiwiU1lUMSIsIkJTTiIsIkhPTUVSMSIsIlNMQzE3QTYiKQpleGNpdGF0b3J5X25ldXJvbnMgPSBjKCJHUklBMiIsIkdSSUExIiwiR1JJQTQiLCJHUklOMSIsIkdSSU4yQiIsIkdSSU4yQSIsIkdSSU4zQSIsIkdSSU4zIiwiR1JJUDEiLCJDQU1LMkEiKQppbmhiaXRvcnlfbmV1cm9ucyA9IGluaCA9IGMoIkdBRDEiLCJHQUQyIiwgIkdBVDEiLCJQVkFMQiIsIkdBQlIyIiwiR0FCUjEiLCJHQlJSMSIsIkdBQlJCMiIsIkdBQlJCMSIsIkdBQlJCMyIsIkdBQlJBNiIsIkdBQlJBMSIsIkdBQlJBNCIsIlRSQUsyIikKYXN0cm9jeXRlcyA8LSBjKCJHRkFQIiwiUzEwMEIiLCJBUVA0IiwiQVBPRSIsICJTT1g5IiwiU0xDMUEzIikKb2xpZ29kZW5kcm9jeXRlcyA8LSBjKCJNQlAiLCJNT0ciLCJPTElHMSIsIk9MSUcyIiwiU09YMTAiKQpvcGMgPC0gCnJhZGlhbF9nbGlhIDwtIGMoIlBUUFJDIiwiQUlGMSIsIkFER1JFMSIsICJWSU0iLCAiVE5DIiwiUFRQUloxIiwiRkFNMTA3QSIsIkhPUFgiLCJMSUZSIiwKICAgICAgICAgICAgICAiSVRHQjUiLCJJTDZTVCIsIlNMQzFBMyIpCmVwaXRoZWxpYWwgPC0gYygiSEVTMSIsIkhFUzUiLCJTT1gyIiwiU09YMTAiLCJORVMiLCJDREgxIiwiTk9UQ0gxIikKCm1pY3JvZ2xpYSA8LSBjKCJJQkExIiwiUDJSWTEyIiwiUDJSWTEzIiwiVFJFTTExOSIsICJHUFIzNCIsIlNJR0xFQ0giLCJUUkVNMiIsCiAgICAgICAgICAgICAgICJDWDNDUjEiLCJGQ1JMUyIsIk9MRk1MMyIsIkhFWEIiLCJUR0ZCUjEiLCAiU0FMTDEiLCJNRVJUSyIsCiAgICAgICAgICAgICAgICJQUk9TMSIpCgpmZWF0dXJlc19saXN0IDwtIGMoIk1LSTY3IiwiU09YMiIsIlBPVTVGMSIsIkRMWDIiLCJQQVg2IiwiU09YOSIsIkhFUzEiLCJORVMiLCJSQkZPWDMiLCJNQVAyIiwiTkNBTTEiLCJDRDI0IiwiR1JJQTIiLCJHUklOMkIiLCJHQUJCUjEiLCJHQUQxIiwiR0FEMiIsIkdBQlJBMSIsIkdBQlJCMiIsIlRIIiwiQUxESDFBMSIsIkxNWDFCIiwiTlI0QTIiLCJDT1JJTiIsIkNBTEIxIiwiS0NOSjYiLCJDWENSNCIsIklUR0E2IiwiU0xDMUEzIiwiQ0Q0NCIsIkFRUDQiLCJTMTAwQiIsICJQREdGUkEiLCJPTElHMiIsIk1CUCIsIkNMRE4xMSIsIlZJTSIsIlZDQU0xIikKCnNob3J0X2xpc3QgPC0gYygiTUtJNjciLCJTT1g5IiwiSEVTMSIsIk5FUyIsIkRMWDIiLCJSQkZPWDMiLCJNQVAyIiwiVEgiLCJDQUxCMSIsIktDTko2IiwiU0xDMUEzIiwiQ0Q0NCIsIkFRUDQiLCJTMTAwQiIsIk9MSUcyIiwiTUJQIiwiVklNIikKCgpgYGAKClNldXJhdCBoYXMgc2V2ZXJhbCBoZWxwZnVsIHBsb3R0aW5nIGZ1bmN0aW9uIHRoYXQgdXNlIGdncGxvdAoKYGBge3J9CiMgd2Ugc2V0IHRoZSBhY3RpdmUgaWRlbnRpdHkgb2YgdGhlIG1ldGEgZGF0YSB0byBiZSB0aGUgY2x1c3RlcnMgYXQgdGhlIHJlc29sdXRpb24gd2Ugd2FudCB0byBsYWJlbApJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMC42IgoKRmVhdHVyZVBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGxhYmVsID0gVFJVRSwgZmVhdHVyZXMgPSBzaG9ydF9saXN0KQoKCgpgYGAKCgpgYGB7cn0KIyB0aGlzIHdpbGwgbGV0IHVzIHNlZSBvbmUgYXQgYXQgdGltZQpmb3IgKGkgaW4gc2hvcnRfbGlzdCkgewogIHByaW50KEZlYXR1cmVQbG90KGludGVncmF0ZWRfc2V1cmF0LCBmZWF0dXJlcyA9IGksIG1pbi5jdXRvZmYgPSAncTEnLCBtYXguY3V0b2ZmID0gJ3E5NycsIGxhYmVsID0gVFJVRSkpCn0KCgpgYGAKTm93IHRoYXQgd2Ugc2VlIHRoZSBUSCBpcyBhbGwgaW4gb25lIHNwb3QgdGhhdCBpcyBwYXJ0IG9mIGEgbGFyZ2UgY2x1c3RlciB3ZSBsb29rIGJhY2sgYXQgdGhlIGRpZmZlcmVudCBjbHVzdGVyIGxldmVsLgoKYGBge3J9CiMgbG9vayBhdCB0aGUgRmVhdHVyZSBwbG90cyB3aXRoIHRoZSBjbHVzdGVyIHJlc29sdXRpb24gMQoKCmBgYAoKCkRvdCBQbG90cwoKYGBge3J9CgpEb3RQbG90KGludGVncmF0ZWRfc2V1cmF0LCBncm91cC5ieSA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMSIsIAogICAgICAgIGZlYXR1cmVzID0gc2hvcnRfbGlzdCwgYXNzYXkgPSAiUk5BIikgKyBSb3RhdGVkQXhpcygpCgoKCkRvdFBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gImludGVncmF0ZWRfc25uX3Jlcy4xIiwgCiAgICAgICAgZmVhdHVyZXMgPSBkYV9uZXVyb25zLCBhc3NheSA9ICJSTkEiKSArIFJvdGF0ZWRBeGlzKCkKCkRvdFBsb3QoaW50ZWdyYXRlZF9zZXVyYXQsIGdyb3VwLmJ5ID0gImludGVncmF0ZWRfc25uX3Jlcy4xIiwgCiAgICAgICAgZmVhdHVyZXMgPSBtYXR1cmVfbmV1cm9ucywgYXNzYXkgPSAiUk5BIikgKyBSb3RhdGVkQXhpcygpCgoKYGBgCgpIZWF0bWFwcwoKYGBge3J9CgoKRG9IZWF0bWFwKGludGVncmF0ZWRfc2V1cmF0LCBncm91cC5ieSA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMSIsIAogICAgICAgIGZlYXR1cmVzID0gc2hvcnRfbGlzdCwgc2xvdCA9ICJzY2FsZS5kYXRhIikKCmBgYAoKTG9vayBhdCBtb3JlIGV4cHJlc3Npb24gbGlzdHMKCmBgYHtyfQoKCmBgYAoKCkZpbmQgQ2x1c3RlciBtYXJrZXJzCgpgYGB7cn0KIyBjbHVzdGVyIG1hcmtlcnMgd2lsbCBiZSBjYWxjdWxhdGVkIGZvciB0aGUgYWN0aXZlIGlkZW50aXR5CgpJZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMSIKQ2x1c3Rlck1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoaW50ZWdyYXRlZF9zZXVyYXQsIG9ubHkucG9zID0gVFJVRSkKCiMgb3B0aW9uYWw6IHNhdmUgdGhlIGNsdXN0ZXIgbWFya2Vycwp3cml0ZS5jc3YoQ2x1c3Rlck1hcmtlcnMsIkNsdXN0ZXJNYXJrZXJzLmNzdiIpCgpgYGAKClNlZSB0aGUgdG9wIGNsdXN0ZXIgbWFya2VycwoKYGBge3J9CmhlYWQoQ2x1c3Rlck1hcmtlcnMpCnRvcDUgPC0gQ2x1c3Rlck1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuPTUsIHd0ID1hdmdfbG9nMkZDKQoKdG9wMiA8LSBDbHVzdGVyTWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG49Miwgd3QgPWF2Z19sb2cyRkMpCkRvSGVhdG1hcChpbnRlZ3JhdGVkX3NldXJhdCwgZmVhdHVyZXMgPSB0b3A1JGdlbmUsIHNpemUgPSAzLCBhbmdsZSA9IDkwLCBncm91cC5ieSA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMSIpCgpEb0hlYXRtYXAoaW50ZWdyYXRlZF9zZXVyYXQsIGZlYXR1cmVzID0gdG9wMiRnZW5lLCBzaXplID0gMywgYW5nbGUgPSA5MCwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiKQoKYGBgCgpOb3cgd2UgY2FuIGxvb2sgYXQgdGhlIGNsdXN0ZXIgbWFya2VycyBmb3IgY2x1c3RlciB1c2luZyBFbnJpY2hSIHRvIGNvbXBhcmUgdG8gcmVmZXJlbmNlIGxpYnJhcmllcwoKYGBge3J9CgoKc2V0RW5yaWNoclNpdGUoIkVucmljaHIiKSAjIEh1bWFuIGdlbmVzCiMgbGlzdCBvZiBhbGwgdGhlIGRhdGFiYXNlcwoKZGJzIDwtIGxpc3RFbnJpY2hyRGJzKCkKCiMgdGhpcyB3aWxsIGxpc3QgdGhlIHBvc3NpYmxlIGxpYnJhcmllcwpkYnMKCiMgc2VsZWN0IGxpYnJhcmllcyB3aXRoIGNlbGwgdHlwZXMKZGIgPC0gYygnQ2VsbE1hcmtlcl9BdWdtZW50ZWRfMjAyMScsJ0F6aW11dGhfQ2VsbF9UeXBlc18yMDIxJykKCgpgYGAKCgoKSGVyZSBpcyBhIHNtYWxsIGZ1bmN0aW9uIHRvIHJ1biBlYXNpbHkgb24gZWFjaCBjbHVzdGVyIGFuZCBmaW5kIHRoZSBjZWxsIHR5cGUgbGlicmFyeSBwcmVkaWN0aW9ucyAoc3BlY2lmaWMgdG8gdGhlIGxpYnJhcmllcyBJIHNlbGVjdGVkKQoKYGBge3J9CgpjaGVja0NlbGx0eXBlcyA8LSBmdW5jdGlvbihjbHVzdGVyX251bSA9IDApewogIGNsdXN0ZXJYIDwtIENsdXN0ZXJNYXJrZXJzICU+JSBmaWx0ZXIoY2x1c3RlciA9PSBjbHVzdGVyX251bSAmIGF2Z19sb2cyRkMgPiAwLjI1KQogIGdlbmVzIDwtIGNsdXN0ZXJYJGdlbmUKICAjIHRoZSBjZWxsIHR5cGUgbGlicmFyaWVzCiAgIyBnZXQgdGhlIHJlc3VsdHMgZm9yIGVhY2ggbGlicmFyeQogIGNsdXN0ZXJYLmNlbGwgPC0gZW5yaWNocihnZW5lcywgZGF0YWJhc2VzID0gZGIpCiAgIyB2aXN1bGl6ZSB0aGUgcmVzdWx0cwpwcmludChwbG90RW5yaWNoKGNsdXN0ZXJYLmNlbGxbWzFdXSwgc2hvd1Rlcm1zID0gMjAsIG51bUNoYXIgPSA0MCwgeSA9ICJDb3VudCIsIG9yZGVyQnkgPSAiUC52YWx1ZSIsIHRpdGxlID0gJ0NlbGxNYXJrZXJfQXVnbWVudGVkXzIwMjEnKSkKcHJpbnQocGxvdEVucmljaChjbHVzdGVyWC5jZWxsW1syXV0sIHNob3dUZXJtcyA9IDIwLCBudW1DaGFyID0gNDAsIHkgPSAiQ291bnQiLCBvcmRlckJ5ID0gIlAudmFsdWUiLCB0aXRsZSA9ICdBemltdXRoX0NlbGxfVHlwZXNfMjAyMScpKQoKfQoKYGBgCgpSdW4gdGhlIGZ1bmN0aW9uIGZvciBlYWNoIGNsdXN0ZXIgdG8gc2VlIGlmIHdlIGNhbiBpZGVudGlmeSBjZWxsIHR5cGVzCgpgYGB7cn0KCmNsdXN0ZXIwIDwtIGNoZWNrQ2VsbHR5cGVzKGNsdXN0ZXJfbnVtID0gMCkKCmBgYApDbHVzdGVyIDAgaXMgbGlrZWx5IGltbWF0dXJlIG5ldXJvbnMgLSBwb3NzaWJseSBib3RoIEdsdXRhbWF0ZXJnaWMgYW5kIGdhYmFlcmdpYwoKYGBge3J9CmNsdXN0ZXIxIDwtIGNoZWNrQ2VsbHR5cGVzKGNsdXN0ZXJfbnVtID0gMSkKYGBgCkNsdXN0ZXIgMSBpcyBhc3Ryb2N5dGVzCgpgYGB7cn0KCmNoZWNrQ2VsbHR5cGVzKGNsdXN0ZXJfbnVtID0gMTEpCgpgYGAKCkFmdGVyIHdlIGhhdmUgbG9va2VkIGF0IGFsbCB0aGUgY2x1c3RlcnMgd2UgYWRkIG1hbnVhbCBhbm5vdGF0aW9ucwoKCmBgYHtyfQoKIyB3ZSBuZWVkIHRvIHNldCB0aGUgaWRlbnRpdHkgdG8gcmVuYW1lCklkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkgPC0gImludGVncmF0ZWRfc25uX3Jlcy4xIgoKIyB3ZSBuZWVkIHRvIG1ha2UgYSB2ZWN0b3Igb2YgdGhlIGNlbGwgdHlwZSBpbiB0aGUgc2FtZSBvcmRlciAtIGluIHRoZSBjbHVzdGVyIG9yZGVyCgpjZWxsX3R5cGVzMSA8LSBjKCJuZXVyb25zX2ltbWF0dXJlIiwgImFzdHJvY3l0ZXNfMSIsImdsaWEiLAogICAgICAgICAgICAgICAgICJuZXVyb25zX21hdHVyZSIsIk9QQyIsImVuZG90aGVsaWFsXzEiLAogICAgICAgICAgICAgICAgICJlbmRvdGhlbGlhbF8yIiwiYXN0cm9jeXRlXzIiLCJSYWRpYWxHbGlhIiwKICAgICAgICAgICAgICAgICAibmV1cm9uczEiLCJuZXVyb25zX0dBQkEiLCJuZXVyb25zMiIsIm5ldXJhbF9zdGVtIiwiREFuZXVyb25zIikKICAKbmFtZXMoY2VsbF90eXBlczEpIDwtIGxldmVscyhpbnRlZ3JhdGVkX3NldXJhdCkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gUmVuYW1lSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0LCBjZWxsX3R5cGVzMSkKaW50ZWdyYXRlZF9zZXVyYXQgPC0gQWRkTWV0YURhdGEob2JqZWN0PWludGVncmF0ZWRfc2V1cmF0LCBtZXRhZGF0YT1JZGVudHMoaW50ZWdyYXRlZF9zZXVyYXQpLCBjb2wubmFtZSA9ICJDZWxsVHlwZXMiKQoKCmBgYAoKCkxldHMgbG9vayBhdCB0aGUgYW5ub3RhdGlvbnMgb24gdGhlIFVNQVAKCmBgYHtyfQoKRGltUGxvdChpbnRlZ3JhdGVkX3NldXJhdCwgZ3JvdXAuYnkgPSAiQ2VsbFR5cGVzIiwgbGFiZWwgPSBUUlVFKQoKYGBgCgoKIyBCUkVBSwoKCkF1dG9tYXRlZCBhbm5vdGF0aW9uIApXZSByZXF1aXJlIHJlZmVyZW5jZSBkYXRhIG9iamVjdHMgZm9yIGJvdGggbWV0aG9kcyB3ZSB3aWxsIHVzZQoKYGBge3J9CgojIGRldmVsb3BpbmcgZm9yZWJyYWluCmRldmZvcmVicmFpbiA8LSByZWFkUkRTKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QdWJsaWNEYXRhL0thcm9saW5za2lfRGV2Rm9yZWJyYWluX2Rvd25zYW1wbGVfTGV2ZWwxLlJEUyIpCgojIGRldmVsb3BpbmcgY29ydGV4CgpkZXZjb3RleCA8LSByZWFkUkRTKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QdWJsaWNEYXRhL05vd2Frb3dza2lfZGV2X2NvcnRleHQuUkRTIikKCiMgYWR1bHQgbWlkYnJhaW4KCm1pZGJyYWluIDwtIHJlYWRSRFMoIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1B1YmxpY0RhdGEvS2FtYXRoVG90YWxfZG93bnNhbXBsZS5SRFMiKQoKI2NoZWNrIHRoZSBtZXRhIGRhdGEKcHJpbnQoIkRldmVsb3BpbmcgRm9yZWJyYWluIikKY29sbmFtZXMoZGV2Zm9yZWJyYWluQG1ldGEuZGF0YSkKcHJpbnQoIkRldmVsb3BpbmcgY29ydGV4IikKY29sbmFtZXMoZGV2Y290ZXhAbWV0YS5kYXRhKQpwcmludCgiQWR1bHQgbWlkYnJhaW4iKQpjb2xuYW1lcyhtaWRicmFpbkBtZXRhLmRhdGEpCgojIHdlIG5lZWQgdG8ga25vdyB0aGUgbWV0YWRhdGEgc2xvdCBuYW1lIHRvIHVzZQoKCmBgYAoKU2V1cmF0IGxhYmVsIHRyYW5zZmVyIHVzaW5nIGZpbmQgYW5jaG9ycyAtIHByZWRpY3RzIGNlbGwgdHlwZXMgZnJvbSBhIHJlZmVyZW5jZSBTZXVyYXQgb2JqZWN0CgpgYGB7cn0KCiMgc2V0IHRoZSBhY3RpdmUgbWV0YSBkYXRhIHRvIGJlIHRoZSBjZWxsIHR5cGUgbGFiZWxzIHdlIHdhbnQKCklkZW50cyhkZXZmb3JlYnJhaW4pIDwtICJDZWxsdHlwZXMiCiMgc2V0IHRoZSBkZWZhdWx0IGFzc2F5IHRvIGJlIFJOQSBiZWNhdXNlIHRob3NlIGFyZSB0aGUgZXhwcmVzc2lvbiB2YWx1ZXMgd2Ugd2FudApEZWZhdWx0QXNzYXkoZGV2Zm9yZWJyYWluKSA8LSAiUk5BIgoKIyBmaW5kIHRoZSByZWZlcmVuY2UgYW5jaG9ycwphbmNob3JzIDwtIEZpbmRUcmFuc2ZlckFuY2hvcnMocmVmZXJlbmNlID0gZGV2Zm9yZWJyYWluICxxdWVyeSA9IGludGVncmF0ZWRfc2V1cmF0LCBkaW1zID0gMToyNSkKCiMgbm93IHdlIG1ha2UgcHJlZGljdGlvbnMgd2l0aCB0aGUgYW5jaG9ycwpwcmVkaWN0aW9ucyA8LSBUcmFuc2ZlckRhdGEoYW5jaG9yc2V0ID0gYW5jaG9ycywgcmVmZGF0YSA9IGRldmZvcmVicmFpbiRDZWxsdHlwZXMpCgojIGxvb2sgYXQgdGhlIHByZWRpY3Rpb25zIG91dHB1dApoZWFkKHByZWRpY3Rpb25zKQoKIyBhZGQgdGhlIHByZWRpY3Rpb25zIHRvIHRoZSBtZXRhIGRhdGEKaW50ZWdyYXRlZF9zZXVyYXQgPC0gQWRkTWV0YURhdGEoaW50ZWdyYXRlZF9zZXVyYXQsIG1ldGFkYXRhID0gcHJlZGljdGlvbnMkcHJlZGljdGVkLmlkLCBjb2wubmFtZSA9ICJwcmVkaWN0ZWRfSUQiKQoKIyB3ZSBjYW4gYWxzbyBjb25zaWRlciB0aGUgcHJvYmFiaWxpdHkgb2YgZWFjaCBwcmVkaWN0aW9uCmludGVncmF0ZWRfc2V1cmF0JHByZWRpY3RlZF90aHJlc2hvbGQgPC0gaWZlbHNlKHByZWRpY3Rpb25zJHByZWRpY3Rpb24uc2NvcmUubWF4ID4gMC43NSwgaW50ZWdyYXRlZF9zZXVyYXQkcHJlZGljdGVkX0lELCAiTm9uZSIpCgogCiMjIGNoZWNrIHRoZSBwcm9wb3J0aW9uIG9mIGNlbGwgdHlwZXMgcHJlZGljdGVkIGluIGVhY2ggY2x1c3RlcgoKdC5sYWJsZXMgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShpbnRlZ3JhdGVkX3NldXJhdCRpbnRlZ3JhdGVkX3Nubl9yZXMuMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlZF9zZXVyYXQkcHJlZGljdGVkX0lEKSkKdC5sYWJsZXMkRnJlcSA8LSBhcy5kb3VibGUodC5sYWJsZXMkRnJlcSkKZ2dwbG90KHQubGFibGVzLCBhZXMoeSA9IEZyZXEsIHggPSBWYXIxLCBmaWxsID0gVmFyMikpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siLCBzdGF0PSAiaWRlbnRpdHkiKQoKIyBzZWUgcHJlZGljdGlvbnMgYnkgY2x1c3RlciBpbiBhIHRhYmxlCnRvcC5wcmVkIDwtIGFzLmRhdGEuZnJhbWUodC5sYWJsZXMgICU+JSBncm91cF9ieShWYXIxKSAgJT4lIHRvcF9uKDIsIEZyZXEpKSAlPiUgYXJyYW5nZShWYXIxLCBkZXNjKEZyZXEpKQp0b3AucHJlZAoKCgpgYGAKCgoKCnNjQ2xhc3NpZnkgUiB3ZWlnaHRlZCBrTk4gaHR0cHM6Ly9kb2kub3JnLzEwLjE1MjUyL21zYi4yMDE5OTM4OQpodHRwczovL3N5ZG5leWJpb3guZ2l0aHViLmlvL3NjQ2xhc3NpZnkvYXJ0aWNsZXMvc2NDbGFzc2lmeS5odG1sCgpXZSBuZWVkIHRvIG1ha2UgdGhlIHJlZmVyZW5jZSBhbmQgcXVlcnkgb2JqZWN0cyBpbnRvIGEgImRnQ01hdHJpeCIgb2JqZWN0CgpgYGB7cn0KcmVmIDwtIGRldmZvcmVicmFpbgoKcmVmJExldmVsMSA8LSBOVUxMCgpjb2xuYW1lcyhyZWZAbWV0YS5kYXRhKQoKCiMgbWFrZSBhIGRmQ01hdHJpeCBmcm9tIFNldXJhdCBvYmplY3QgdG8gdXNlIGluIHNjQ2xhc3NpZnkKSWRlbnRzKHJlZikgPC0gIkNlbGx0eXBlcyIKCmRnQ01hdF9yZWYgPC0gR2V0QXNzYXlEYXRhKHJlZikKIyBnZXQgdGhlIGNlbGwgdHlwZSBkYXRhCklkZW50cyhyZWYpIDwtICJDZWxsdHlwZXMiCnJlZl9jZWxsdHlwZXMgPC0gSWRlbnRzKHJlZikKdW5pcXVlKHJlZl9jZWxsdHlwZXMpCgoKIyBjb252ZXJ0IHRoZSBpbnRlZ3JhdGVkIGNsdXN0ZXJlZCBvYmplY3QgaW50byBkZ0NNYXRyaXgKRGVmYXVsdEFzc2F5KGludGVncmF0ZWRfc2V1cmF0KSA8LSAiUk5BIgpkZ0NNYXRfcXVlcnkgPC0gR2V0QXNzYXlEYXRhKGludGVncmF0ZWRfc2V1cmF0KQoKIyBnZXQgdGhlIG1ldGEgZGF0YSB0byBncm91cCBwcmVkaWN0aW9ucyBieQojIHdlIHdpbGwgdXNlIHRoZSBjbHVzdGVycyBpZHMgCiMgd2UgY291bGQgdXNlIHRoZSBjZWxsIHR5cGUgYW5ub3RhdGlvbnMgd2UgbWFkZSBhYm92ZQoKSWRlbnRzKGludGVncmF0ZWRfc2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiCnF1ZXJ5X2NsdXN0ZXJzIDwtIElkZW50cyhpbnRlZ3JhdGVkX3NldXJhdCkKCiMgY2hlY2sgdGhlIG9iamVjdHMKZGltKGRnQ01hdF9yZWYpCmRpbShkZ0NNYXRfcXVlcnkpCgpjbGFzcyhkZ0NNYXRfcmVmKQpjbGFzcyhkZ0NNYXRfcXVlcnkpCgpgYGAKClNlZSB0aGUgb3JpZ2luYWwgY2VsbCB0eXBlIGFubm90YXRpb25zCmBgYHtyfQp0YWJsZShyZWZfY2VsbHR5cGVzKQp0YWJsZShxdWVyeV9jbHVzdGVycykKCmxlbmd0aChyZWZfY2VsbHR5cGVzKQpsZW5ndGgocXVlcnlfY2VsbHR5cGVzKQoKYGBgCgpSdW4gc2NDbGFzc2lmeQpgYGB7cn0KCnNjQ2xhc3NpZnlfcmVzIDwtIHNjQ2xhc3NpZnkoZXhwcnNNYXRfdHJhaW4gPSBkZ0NNYXRfcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUeXBlc190cmFpbiA9IHJlZl9jZWxsdHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcnNNYXRfdGVzdCA9IGRnQ01hdF9xdWVyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsVHlwZXNfdGVzdCA9IHF1ZXJ5X2NsdXN0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUgPSAiSE9QQUNIIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0gPSAiV0tOTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0RmVhdHVyZXMgPSBjKCJsaW1tYSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbWlsYXJpdHkgPSBjKCJwZWFyc29uIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuTGlzdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKCmBgYAoKYGBge3J9CgoKcGxvdENlbGxUeXBlVHJlZShjZWxsVHlwZVRyZWUoc2NDbGFzc2lmeV9yZXMkdHJhaW5SZXMpKQoKCmBgYAoKCgpTZWUgdGhlIGNlbGwgdHlwZSBwcmVkaWN0aW9ucyBieSBjbHVzdGVyCgpgYGB7cn0KCnRhYmxlKHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcyxxdWVyeV9jbHVzdGVycykKCgpgYGAKCgpDaGVjayBhbm90aGVyIHJlZmVyZW5jZSBzZXQKCmBgYHtyfQojIHJlZnJlbmNlIGRhdGEKIyB3ZSBoYXZlIHRoZSBkYXRhIHByZXBhcmVkIGFzIGEgU2V1cmF0IG9iamVjdAoKcmVmMiA8LSBtaWRicmFpbgpyZWYyCgojY2hlY2sgdGhlIG1ldGEgZGF0YQpjb2xuYW1lcyhyZWYyQG1ldGEuZGF0YSkKCiNtYWtlIHRoZSByZWZlcmVuY2UgbWF0cml4IGFuZCByZWZlcmVuY2UgY2VsbCB0eXBlcyAKCgpkZ0NNYXRfcmVmMiA8LSBHZXRBc3NheURhdGEocmVmMikKIyBnZXQgdGhlIGNlbGwgdHlwZSBkYXRhCklkZW50cyhyZWYyKSA8LSAiQ2VsbF9UeXBlIiAKcmVmX2NlbGx0eXBlczIgPC0gSWRlbnRzKHJlZjIpCnVuaXF1ZShyZWZfY2VsbHR5cGVzMikKCiMgY2hlY2sgdGhlIG9iamVjdApkaW0oZGdDTWF0X3JlZjIpCgoKY2xhc3MoZGdDTWF0X3JlZjIpCgoKCmBgYAoKYGBge3J9CiMgcHJlZGljdCB0aGUgY2x1c3RlciBjZWxsIHR5cGVzIGZyb20gdGhlIHNlY29uZCByZWZlcmVuY2UKc2NDbGFzc2lmeV9yZXMgPC0gc2NDbGFzc2lmeShleHByc01hdF90cmFpbiA9IGRnQ01hdF9yZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUeXBlc190cmFpbiA9IHJlZl9jZWxsdHlwZXMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzTWF0X3Rlc3QgPSBkZ0NNYXRfcXVlcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFR5cGVzX3Rlc3QgPSBxdWVyeV9jbHVzdGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gIkhPUEFDSCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtID0gIldLTk4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEZlYXR1cmVzID0gYygibGltbWEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1pbGFyaXR5ID0gYygicGVhcnNvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkxpc3QgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpClN5cy50aW1lKCkKCmBgYAoKYGBge3J9CgpwbG90Q2VsbFR5cGVUcmVlKGNlbGxUeXBlVHJlZShzY0NsYXNzaWZ5X3JlcyR0cmFpblJlcykpCgpgYGAKClNlZSB0aGUgcHJlZGljdGlvbnMgYnkgY2x1c3RlcgoKYGBge3J9CnRhYmxlKHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcyxxdWVyeV9jbHVzdGVycykKCgoKYGBgCgpgYGB7cn0KIyByZWZvcm1hdCB0byBzZWUgdGhlIHRvcCBwcmVkaWN0aW9ucyBmb3IgZWFjaCBjbHVzdGVyCgpwcmVkX2NvdW50cyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHF1ZXJ5X2NsdXN0ZXJzLHNjQ2xhc3NpZnlfcmVzJHRlc3RSZXMkdGVzdCRwZWFyc29uX1dLTk5fbGltbWEkcHJlZFJlcykpCgpwcmVkX2NvdW50cyRGcmVxIDwtIGFzLmRvdWJsZShwcmVkX2NvdW50cyRGcmVxKQoKaGVhZChwcmVkX2NvdW50cykKIyBzZWUgcHJlZGljdGlvbnMgYnkgY2x1c3RlciBpbiBhIHRhYmxlCnRvcC5wcmVkIDwtIGFzLmRhdGEuZnJhbWUocHJlZF9jb3VudHMgICU+JSBncm91cF9ieShxdWVyeV9jbHVzdGVycykgICU+JSB0b3BfbigyLCBGcmVxKSkgJT4lIGFycmFuZ2UocXVlcnlfY2x1c3RlcnMsIGRlc2MoRnJlcSkpCnRvcC5wcmVkCgoKYGBgCgoKQWRkIHByZWRpY3Rpb24gYW5ub3RhdGlvbnMKCgpgYGB7cn0KCgpgYGAKCkFkanVzdCBhbm5vdGF0aW9ucyAtIG1lcmdlIGNsdXN0ZXJzIG9yIG5vdAoKYGBge3J9CgoKYGBgCgoKCgo=